对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。可以通过下面的测试代码来验证这一点:
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 }
运行一下上面的代码,结果马上呈现在我们的眼前:
- 父类--静态变量
- 父类--静态初始化块
- 子类--静态变量
- 子类--静态初始化块
- 父类--变量
- 父类--初始化块
- 父类--构造器
- 子类--变量
- 子类--初始化块
- 子类--构造器
现在,结果已经不言自明了。大家可能会注意到一点,那就是,并不是父类完全初始化完毕后才进行子类的初始化,实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。
那么对于静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢?是否静态变量总是先于静态初始化块,变量总是先于初始化块就被初始化了呢?实际上这取决于它们在类中出现的先后顺序。我们以静态变量和静态初始化块为例来进行说明。
同样,我们还是写一个类来进行测试:
那么对于静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢?是否静态变量总是先于静态初始化块,变量总是先于初始化块就被初始化了呢?实际上这取决于它们在类中出现的先后顺序。我们以静态变量和静态初始化块为例来进行说明。
同样,我们还是写一个类来进行测试:
1 public class test_static_order { 2 3 //静态初始化块 4 static 5 { 6 System.out.println("静态初始化块"); 7 } 8 //静态变量 9 public static test_1 a = new test_1(); 10 11 //静态变量 12 public static test_2 b = new test_2(); 13 14 public static void main(String[] args){ 15 new test_static_order(); 16 } 17 18 } 19 20 class test_1 21 { 22 public test_1(){ 23 System.out.println("test--1--静态变量"); 24 } 25 } 26 27 class test_2 28 { 29 public test_2(){ 30 System.out.println("test--2--静态变量"); 31 } 32 }
静态初始化块
test--1--静态变量
test--2--静态变量