static class Father {
public static int a = 1;
static {
System.out.println("执行father static object a=" + a);
a = 2;
}
{
System.out.println("执行 father object a=" + a);
}
public Father() {
System.out.println("执行 Father construct a=" + a);
a = 6;
}
}
static class Son extends Father {
static {
System.out.println("执行 Son static object a=" + a);
a = 3;
}
{
System.out.println("执行 Son object a=" + a);
}
public Son() {
System.out.println("执行 Son construct a=" + a);
a = 4;
}
}
@Test
public void testLoad() {
// Father father =new Son();
System.out.println(Son.a);
}
代码输出2, 说明只执行了父类的静态代码块,子类的静态代码块为啥不执行
静态代码块在类加载的时候只会执行一次~子类继承父类,会先执行父类的代码块。
通过子类引用父类的静态字段不会导致子类的初始化
首先你把 Father father =new Son();
注释掉了,因此只有一条语句 System.out.println(Son.a);
执行了。
那么这条语句打印 Son 类的静态成员 a,不过 Son 没有声明这个成员,它实际上指的是 Father.a。
好,那么整个初始化过程是:
System.out.println
,至于 Son 类就不用初始化了。