通过Java反射API也可能造成类和接口的初始化。需要注意的是,当访问一个Java类或接口中的静态域的时候,只有真正声明这个域的类或接口才会被初始化。考虑下面的代码:
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的类静态变量;
静态内部类,可以声明非final的静态变量和静态代码块。