类初始化顺序遵循以下三个原则(优先级依次递减)
1、静态对象(变量)优先于非静态对象(变量)初始化,其中静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次;
2、父类优先于子类初始化;
3、成员变量按照定义先后顺序进行初始化;
例如:静态变量、非静态变量、静态代码块、非静态代码块、构造函数、父类、子类等,他们的初始化顺序是:父类静态变量 > 父类静态代码块 > 子类静态变量 > 子类静态代码块 > 父类非静态变量 > 父类非静态代码块 > 父类构造函数 > 子类非静态变量 > 子类非静态代码块 > 子类构造函数。
下面给出一个不同模块初始化的初始化顺序的例子
class Base{
//静态变量
private static String parentParam1 = "我是父类-静态变量!";
//非静态变量
private String parentParam2 = "我是父类-非静态变量!";
static {
System.out.println("父类-静态变量是否初始化完成:parentParam1=" + parentParam1);
System.out.println("父类-静态代码初始化块完成!");
}
{
System.out.println("父类-非静态变量是否初始化完成:parentParam2=" + parentParam2);
System.out.println("父类-非静态代码块初始化完成!");
}
public Base() {
System.out.println("父类-构造函数初始化完成!");
}
}
public class TestJavaBeanInitOrder extends Base {
private static String sonParam1 = "我是子类-静态变量!";
private String sonParam2 = "我是子类-非静态变量!";
static {
System.out.println("子类-静态变量是否初始化完成:sonParam1" + sonParam1);
System.out.println("子类-静态代码块初始化完成!");
}
{
System.out.println("子类-非静态变量是否初始化完成:sonParam2" + sonParam2);
System.out.println("子类-非静态代码块初始化完成!");
}
public TestJavaBeanInitOrder() {
System.out.println("子类-构造函数初始化完成!");
}
public static void main(String[] args) {
new TestJavaBeanInitOrder();
}
}
测试结果如下:
父类-静态变量是否初始化完成:parentParam1=我是父类-静态变量!
父类-静态代码初始化块完成!
子类-静态变量是否初始化完成:sonParam1我是子类-静态变量!
子类-静态代码块初始化完成!
父类-非静态变量是否初始化完成:parentParam2=我是父类-非静态变量!
父类-非静态代码块初始化完成!
父类-构造函数初始化完成!
子类-非静态变量是否初始化完成:sonParam2我是子类-非静态变量!
子类-非静态代码块初始化完成!
子类-构造函数初始化完成!