对于静态变量、静态初始化块、变量、初始化块、构造器的初始化顺序,为,((父类)静态变量、静态初始化块(排序按先后次序))>((子类)静态变量、静态初始化块(排序按先后次序))>((父类)变量、初始化块(排序按先后次序))>(父类)构造器>((子类)变量、初始化块(排序按先后次序))>(子类)构造器。
先来举例说说:
class Test { static { System.out.println("父类static 块 1 执行"); } static Sample staticSam1 = new Sample("父类 静态成员staticSam1初始化"); Sample sam1 = new Sample("父类 sam1成员初始化"); static Sample staticSam2 = new Sample("父类 静态成员staticSam2初始化"); static { System.out.println("父类 static 块 2 执行"); } { System.out.println("父类的普通初始化块执行"); } Test() { System.out.println("父类 Test默认构造函数被调用"); } Sample sam2 = new Sample("父类 sam2成员初始化"); } class TestSub extends Test { static Sample staticSamSub = new Sample("子类 静态成员staticSamSub初始化"); TestSub() { System.out.println("子类 TestSub 默认构造函数被调用"); } Sample sam1 = new Sample("子类 sam1成员初始化"); static Sample staticSamSub1 = new Sample("子类 静态成员staticSamSub1初始化"); static { System.out.println("子类 static 块 执行"); } { System.out.println("子类的普通初始化块执行"); } Sample sam2 = new Sample("子类 sam2成员初始化"); } public class Init1 { public static void main(String[] args) { new TestSub(); } }
执行结果为:
父类static 块 1 执行
父类 静态成员staticSam1初始化
父类 静态成员staticSam2初始化
父类 static 块 2 执行
子类 静态成员staticSamSub初始化
子类 静态成员staticSamSub1初始化
子类 static 块 执行
父类 sam1成员初始化
父类的普通初始化块执行
父类 sam2成员初始化
父类 Test默认构造函数被调用
子类 sam1成员初始化
子类的普通初始化块执行
子类 sam2成员初始化
子类 TestSub 默认构造函数被调用