关于java类初始化顺序的学习笔记

来源:互联网 发布:手机自动下棋软件 编辑:程序博客网 时间:2024/05/08 12:16
</pre>1)类的初始化顺序:(静态变量,静态初始化块)>(变量,初始化块)>构造器<pre name="code" class="java">public class InitClass { // 构造器       public InitClass() {           System.out.println("构造器");       }         // 变量       public String  variable = "变量";         // 静态变量       public static String staticVariable = "静态变量";       // 初始化块       {          // System.out.println(staticVariable);// 此处可以引用静态变量也说明了静态变量在初始化代码块着被初始化        System.out.println(variable);         System.out.println("初始化块");                }       // 静态初始化块       static {          // System.out.println(variable);//此处引用非静态变量报错,自己理解是因为静态块是在变量前被初始化的,所以静态块中引用变量时,此变量还不存在故报错        System.out.println(staticVariable);           System.out.println("静态初始化块");       }         public static void main(String[] args) {           new InitClass();   }}

此代码运行结果为:

静态变量
静态初始化块
变量
初始化块
构造器

2)存在继承的类的初始化顺序为:(父类静态变量,父类静态初始化块)>(子类静态变量,子类静态初始化块)>(父类变量,父类初始化块)>父类构造器>(子类变量,子类初始化块)>子类构造器

public class InitFather {    // 构造器          public InitFather() {              System.out.println("父类构造器");          }               // 变量          public String  variable = "父类变量";               // 静态变量          public static String staticVariable = "父类静态变量";          // 初始化块          {              System.out.println(variable);            System.out.println("父类初始化块");                      }          // 静态初始化块          static {              System.out.println(staticVariable);              System.out.println("父类静态初始化块");          }   }public class InitClass extends InitFather{ // 构造器       public InitClass() {           System.out.println("子类构造器");       }         // 变量       public String  variable = "子类变量";         // 静态变量       public static String staticVariable = "子类静态变量";       // 初始化块       {          // System.out.println(staticVariable);// 此处可以引用静态变量也说明了静态变量在初始化代码块着被初始化        System.out.println(variable);         System.out.println("子类初始化块");                }       // 静态初始化块       static {          // System.out.println(variable);//此处引用非静态变量报错,自己理解是因为静态块是在变量前被初始化的,所以静态块中引用变量时,此变量还不存在故报错        System.out.println(staticVariable);           System.out.println("子类静态初始化块");       }         public static void main(String[] args) {           new InitClass();   }} 

此代码运行结果为:

父类静态变量
父类静态初始化块
子类静态变量
子类静态初始化块
父类变量
父类初始化块
父类构造器
子类变量
子类初始化块
子类构造器

3)最后,变量一定是在初始化块前初始化吗?静态变量一定是在静态初始化块着初始化吗?

答案是否定的,这取决于静态变量和静态初始化块、变量和初始化块在代码中出现有位置。

4)静态变量及静态初始化块只会被初始化一次

public class InitClass{ // 构造器       public InitClass() {           System.out.println("子类构造器");       }         // 变量       public String  variable = "子类变量";         // 初始化块       {          // System.out.println(staticVariable);// 此处可以引用静态变量也说明了静态变量在初始化代码块着被初始化        System.out.println(variable);         System.out.println("子类初始化块");                }       // 静态变量       public static String staticVariable = "子类静态变量";          // 静态初始化块       static {          // System.out.println(variable);//此处引用非静态变量报错,自己理解是因为静态块是在变量前被初始化的,所以静态块中引用变量时,此变量还不存在故报错        System.out.println(staticVariable);           System.out.println("子类静态初始化块");       }       public static void main(String[] args) {           new InitClass();           new InitClass();   }}
运行结果如下:
子类静态变量
子类静态初始化块
子类变量
子类初始化块
子类构造器
子类变量
子类初始化块
子类构造器





0 0