java类初始化顺序

对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。可以通过下面的测试代码来验证这一点: 
 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. 静态变量
    2. 静态初始化块
    3. 变量
    4. 初始化块
    5. 构造器
这与上文中说的完全符合。那么对于继承情况下又会怎样呢?我们仍然以一段测试代码来获取最终结果:
 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. 父类--静态变量
  2. 父类--静态初始化块
  3. 子类--静态变量
  4. 子类--静态初始化块
  5. 父类--变量
  6. 父类--初始化块
  7. 父类--构造器
  8. 子类--变量
  9. 子类--初始化块
  10. 子类--构造器
现在,结果已经不言自明了。大家可能会注意到一点,那就是,并不是父类完全初始化完毕后才进行子类的初始化,实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。 

那么对于静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢?是否静态变量总是先于静态初始化块,变量总是先于初始化块就被初始化了呢?实际上这取决于它们在类中出现的先后顺序。我们以静态变量和静态初始化块为例来进行说明。 

同样,我们还是写一个类来进行测试: 
 
 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--静态变量

原文地址:https://www.cnblogs.com/xingele0917/p/3606384.html