• 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--静态变量

  • 相关阅读:
    nginx启动,停止,重启
    获取节点与属性
    修改节点的属性 节点默认不允许修改
    删除节点与属性
    创建属性Attribute
    新增节点NewBook并增加属性Name="WPF"
    创建xml树
    HashTable Queue Stack SortedList BitArray
    ArrayList详细
    sqlserver 优化
  • 原文地址:https://www.cnblogs.com/xingele0917/p/3606384.html
Copyright © 2020-2023  润新知