对象的初始化顺序

    科技2022-07-11  91

    对象的初始化顺序

    由 static 关键字修饰的(如:类变量[静态变量]、静态代码块)将在类被初始化创建实例对象之前被初始化,而且是按顺序从上到下依次被执行; 没有 static 关键字修饰的(如:实例变量[非静态变量]、非静态代码块)初始化实际上是会被提取到类的构造器中被执行的,但是会比类构造器中的代码块优先执行到,其也是按顺序从上到下依次被执行。

    例如:

    public class Father { static final String STATIC_FIELD_01 = getFatherField("STATIC_FIELD_01"); private String field01 = getMemberFatherField("field01"); public Father() { System.out.println("父类构造方法!"); } static { System.out.println("父类静态代码块!"); } static final String STATIC_FIELD_02 = getFatherField("STATIC_FIELD_02"); static String getFatherField(String str) { System.out.println("父类静态成员变量初始化-" + str); return str; } { System.out.println("父类代码块!"); } private String field02 = getMemberFatherField("field01"); String getMemberFatherField(String str) { System.out.println("父类静态成员变量初始化-" + str); return str; } static class Son extends Father { static final String STATIC_FIELD_01 = getSonField("STATIC_FIELD_01"); private String field01 = getMemberSonField("field01"); public Son() { System.out.println("子类构造方法!"); } static { System.out.println("子类静态代码块!"); } static final String STATIC_FIELD_02 = getSonField("STATIC_FIELD_02"); static String getSonField(String str) { System.out.println("子类静态成员变量初始化-" + str); return str; } { System.out.println("子类代码块!"); } private String field02 = getMemberSonField("field02"); String getMemberSonField(String str) { System.out.println("子类成员变量初始化-" + str); return str; } } public static void main(String[] args) { new Son(); } }

    输出: 父类静态成员变量初始化-STATIC_FIELD_01 父类静态代码块! 父类静态成员变量初始化-STATIC_FIELD_02 子类静态成员变量初始化-STATIC_FIELD_01 子类静态代码块! 子类静态成员变量初始化-STATIC_FIELD_02 父类静态成员变量初始化-field01 父类代码块! 父类静态成员变量初始化-field01 父类构造方法! 子类成员变量初始化-field01 子类代码块! 子类成员变量初始化-field02 子类构造方法!

    总结:先初始化父类的静态代码—>初始化子类的静态代码–>初始化父类的非静态代码—>初始化父类构造函数—>初始化子类非静态代码—>初始化子类构造函数

    Processed: 0.029, SQL: 8