静态块和静态变量在类的加载时被执行;加载子类时,会预先加载父类,因此父类中如果有静态块,则最先执行之,然后立即执行子类的静态块;
如果一个类中有多个静态块,则按照编码的先后顺序执行
注:因为一个类只会被加载一次,所以每个静态块只会执行一次
自由块格式(又称“普通块”):
{
// statements;
}
自由块在类被实例化时执行
如果要实例化一个子类,那么它的构造函数会先实例化其父类。因此父类的自由块会先被执行,然后开始构造父类;父类的构造器执行完毕后,操作权返回给子类的构造器,此时开始执行子类的自由块,然后开始构造子类。
执行的顺序依次为:
父类静态块 → 子类静态块 → 父类自由块 → 父类构造函数 → 子类自由块 → 子类构造函数
/*
* Output:
A
C
B
D
E
*/
class ClassA {
public ClassA()
{
System.out.println("D");
}
{
System.out.println("B");
}
}
class Base extends ClassA {
int i;
public Base()
{
i = 10;
System.out.println("E");
}
static
{
System.out.println("A");
}
}
public class ClassB extends Base {
public static void main(String[] args) {
new ClassB();
}
static
{
System.out.println("C");
}
}