在继承体系中,父子类的初始化存在先后顺序,涉及父子类中都存在静态变量、静态代码块、普通变量、普通代码块、构造函数。
其初始化流程图如下:
注:变量和代码块的执行顺序依据代码编写的先后顺序。
以下以代码举例说明,有图有代码有真相,呵呵。
父类:
public class Parent{
private static final String parentStaticStr="初始化父类Static变量";
static {
System.out.println(parentStaticStr);
System.out.println("初始化父类Static代码块");
}
private String parentStr="初始化父类普通变量";
{
System.out.println(parentStr);
System.out.println("初始化父类普通代码块");
}
public Parent(){
System.out.println("初始化父类构造函数");
}
}
子类:
public class Child extends Parent{
private static final String childStaticStr="初始化子类Static变量";
static {
System.out.println(childStaticStr);
System.out.println("初始化子类Static代码块");
}
private String childStr="初始化子类普通变量";
{
System.out.println(childStr);
System.out.println("初始化子类普通代码块");
}
public Child(){
System.out.println("初始化子类构造函数");
}
}
执行:
public class InitOrderTest {
public static void main(String []args){
Child child=new Child();
}
}
执行结果: