对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。可以通过下面的测试代码来验证这一点:
1 public class test_1{ 2 3 public static String staticField = "静态变量"; 4 5 public String field = "变量"; 6 7 // 静态初始化块 8 static { 9 System.out.println(staticField); 10 System.out.println("静态初始化块"); 11 } 12 13 // 初始化块 14 { 15 System.out.println(field); 16 System.out.println("初始化块"); 17 } 18 19 // 构造器 20 public test_1() { 21 System.out.println("构造器"); 22 } 23 24 public static void main(String[] args) { 25 new test_1(); 26 } 27 28 }
运行以上代码,我们会得到如下的输出结果:
- 静态变量
- 静态初始化块
- 变量
- 初始化块
- 构造器
1 class Parent { 2 // 静态变量 3 public static String p_StaticField = "父类--静态变量"; 4 // 变量 5 public String p_Field = "父类--变量"; 6 7 // 静态初始化块 8 static { 9 System.out.println(p_StaticField); 10 System.out.println("父类--静态初始化块"); 11 } 12 13 // 初始化块 14 { 15 System.out.println(p_Field); 16 System.out.println("父类--初始化块"); 17 } 18 19 // 构造器 20 public Parent() { 21 System.out.println("父类--构造器"); 22 } 23 } 24 25 public class SubClass extends Parent { 26 // 静态变量 27 public static String s_StaticField = "子类--静态变量"; 28 // 变量 29 public String s_Field = "子类--变量"; 30 // 静态初始化块 31 static { 32 System.out.println(s_StaticField); 33 System.out.println("子类--静态初始化块"); 34 } 35 // 初始化块 36 { 37 System.out.println(s_Field); 38 System.out.println("子类--初始化块"); 39 } 40 41 // 构造器 42 public SubClass() { 43 System.out.println("子类--构造器"); 44 } 45 46 // 程序入口 47 public static void main(String[] args) { 48 new SubClass(); 49 } 50 }
运行一下上面的代码,结果马上呈现在我们的眼前:
- 父类--静态变量
- 父类--静态初始化块
- 子类--静态变量
- 子类--静态初始化块
- 父类--变量
- 父类--初始化块
- 父类--构造器
- 子类--变量
- 子类--初始化块
- 子类--构造器
现在,结果已经不言自明了。大家可能会注意到一点,那就是,并不是父类完全初始化完毕后才进行子类的初始化,实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。