Java初始化顺序结论:
1 继承体系的所有静态成员初始化(先父类,后子类) (静态成员变量和静态代码块,谁初始化前后,和位置有关系)
2 父类初始化完成(普通成员的初始化-->普通代码块-->构造函数的调用)
3 子类初始化(普通成员-->普通代码块-->构造函数的调用)
代码如下:
父类:
public class ParentClass {
private static String ParentStaticName = "父类静态成员变量";
private String parentName = "父类成员变量";
public ParentClass(){
System.out.println("父类的无参构造函数初始化");
}
static{
System.out.println(ParentStaticName);
System.out.println("父类静态块初始化");
}
{
System.out.println(parentName);
System.out.println("父类方法初始化");
}
}
子类:
public class Subclass extends ParentClass {
private static String SubclassStaticName = "子类静态成员变量";
private String SubclassName = "子类成员变量";
public Subclass(){
System.out.println("子类的无参的构造函数初始化");
}
static{
System.out.println(SubclassStaticName);
System.out.println("子类静态块初始化");
}
{
System.out.println(SubclassName);
System.out.println("子类方法初始化");
}
public static void main(String[] args) {
ParentClass parentClass = new Subclass();
}
}
结果如下:
父类静态成员变量
父类静态块初始化
子类静态成员变量
子类静态块初始化
父类成员变量
父类方法初始化
父类的无参构造函数初始化
子类成员变量
子类方法初始化
子类的无参的构造函数初始化
Process finished with exit code 0
重点:为什么静态无法调用成员变量,原因在于此,类初始化加载顺序有关。