看到了楼主提出的这个问题,我昨天也弄明白了一个类似的问题,现在想起来,特意把我的心得给大家分享一下。以求共同进步吧。
class B {
static int value = 100; static { System.out.println("Class B is initialized."); //输出
}
}
class A extends B {
static { System.out.println("Class A is initialized."); //不会输出
}
}
public class InitTest { public static void main(String[] args) {
System.out.println(A.value); //输出100
}
}
在上述代码中,类InitTest通过A.value引用了类B中声明的静态域value。由于value是在类B中声明的,只有类B会被初始化,而类A则不会被初始化。
1:继承类时会调用父类的Static的成员变量和Static代码块、顺序是按照2个Static代码的先后顺序执行
2:继承情况下,首先是从顶层父类的静态变量和代码块开始执行,依次向下。
3:同一个类中,执行的顺序是依照静态变量和静态代码在类中的编码顺序执行,:变量和代码块无任何优先级之分。
全部继承树中的类静态变量和代码块都初始化完毕后,开始从顶层父类执行非静态的类变量和类代码块初始化,执行顺序同静态,
然后紧接着是执行构造函数,完毕后才向下,执行子类的类变量、代码块和构造函数。 非静态内部类中不能定义类静态代码块和非final的类静态变量; |