java类中涉及到了静态变量、静态块、代码块、构造方法、成员变量和成员方法等等,这些代码都有统一的执行原则,变量定义的先后顺序决定初始化顺序。一下代码中分别涉及到了执行顺序的方法和变量等。我们来看一下执行的结果。
public class TestDynamicLoad {
public static void main(String[] args) {
Father son = new Son();
}
}
class Father {
private static String name = getName();
private String address = getAddressParam();
{
System.out.println("*************父类构造代码块************");
}
static {
System.out.println("*************父类静态代码块************");
}
public Father(){
System.out.println("*************父类构造方法************");
}
public static String getName(){
System.out.println("*************父类静态成员变量************");
return null;
}
public String getAddressParam(){
System.out.println("*************父类普通成员变量************");
return null;
}
}
class Son extends Father{
public static String name = getName();
public String address = getAddress();
{
System.out.println("*************子类构造代码块************");
}
static {
System.out.println("*************子类静态代码块************");
}
public Son(){
System.out.println("*************子类构造方法************");
}
public static String getName(){
System.out.println("*************子类静态成员变量************");
return null;
}
public String getAddress(){
System.out.println("*************子类普通成员变量************");
return null;
}
}
执行结果:
*************父类静态成员变量************
*************父类静态代码块************
*************子类静态成员变量************
*************子类静态代码块************
*************父类普通成员变量************
*************父类构造代码块************
*************父类构造方法************
*************子类普通成员变量************
*************子类构造代码块************
*************子类构造方法************
Process finished with exit code 0
得出结论:
java类的初始化顺序为:父类的静态字段 > 父类静态代码块 > 子类静态字段 > 子类静态代码块 > 父类成员变量 > 父类构造代码块 > 父类构造器 > 子类成员变量 > 子类构造代码块 > 子类构造器。