java类初始化顺序

对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。可以通过下面的测试代码来验证这一点: 
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 }
java类初始化顺序

运行以上代码,我们会得到如下的输出结果: 

    1. 静态变量
    2. 静态初始化块
    3. 变量
    4. 初始化块
    5. 构造器
这与上文中说的完全符合。那么对于继承情况下又会怎样呢?我们仍然以一段测试代码来获取最终结果:

 

java类初始化顺序
 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 }  
java类初始化顺序

 

运行一下上面的代码,结果马上呈现在我们的眼前: 

  1. 父类--静态变量
  2. 父类--静态初始化块
  3. 子类--静态变量
  4. 子类--静态初始化块
  5. 父类--变量
  6. 父类--初始化块
  7. 父类--构造器
  8. 子类--变量
  9. 子类--初始化块
  10. 子类--构造器


现在,结果已经不言自明了。大家可能会注意到一点,那就是,并不是父类完全初始化完毕后才进行子类的初始化,实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。 

java类初始化顺序,布布扣,bubuko.com

java类初始化顺序

上一篇:ASM数据文件和FS之间的各种转换方法(2)


下一篇:JavaScript学习心得(八)