Java虚拟机 类初始化 阶段

Java虚拟机使用某个类的过程,可分为七个阶段:

加载 - 验证 - 准备 - 解析 - 初始化 - 使用 - 卸载

Java虚拟机 类初始化 阶段_第1张图片

本文只介绍在什么情况下对类进行初始化。

Java虚拟机规范对何时进行类的初始化做了严格规范,有且只有四种情况:

1. 虚拟机启动时,指定的主类。

   包含main方法的类。

2. 遇到new、getstatic、putstatic、invokestatic四条指令时。

   new:使用new关键字实例化对象。

   getstatic:读引用一个类的静态字段。

   putstatic:写引用一个类的静态字段。

   invokestatic:调用一个类的静态方法。

3. 初始化一个类时,先初始化其父类。

   接口则不是,只有真正引用到了父接口时,才会初始化。

4. 对类进行反射调用时。


测试代码:

MainClass:

 

[java] view plain copy
  1. package com.xuefeng.jvm.load;  
  2.   
  3. /** 
  4.  * 初始化类的时机 
  5.  * 1. 虚拟机启动时指定的主类 
  6.  * 2. new某类的对象时、引用某类的static变量时、设置某类的变量时、调用某类的static方法时 
  7.  * 3. 初始化一个类时,先初始化其父类。接口则不是,真正使用到了父接口时,才会初始化父接口。 
  8.  * 4. 通过反射调用某类时 
  9.  * @author xuefeng 
  10.  * 
  11.  */  
  12. public class MainClass {  
  13.   
  14.     static {  
  15.         System.out.println("MainClass init.");  
  16.     }  
  17.   
  18.     // 1  
  19.     public static void main(String[] args) throws ClassNotFoundException {  
  20. //      // 2  
  21. //      System.out.println("SuperClass.F_V1 : " + SuperClass.F_V1);  
  22. //      System.out.println("SuperClass.v1 : " + SuperClass.v1);  
  23.   
  24. //      // 3  
  25. //      SubClass s1 = new SubClass();  
  26.           
  27.         // 3.1  如果通过子类名引用父类的static变量,是否会触发子类的初始化?  
  28.         // 这取决于具体的虚拟机实现,Sun HotSpot虚拟机此时是不会触发子类的初始化的。  
  29.         System.out.println(SubClass.v1);  
  30.   
  31.         // 4  
  32.         Class.forName("com.xuefeng.jvm.load.SubClass");  
  33.     }  
  34.   
  35. }  

SuperClass:

 

[java] view plain copy
  1. package com.xuefeng.jvm.load;  
  2.   
  3. public class SuperClass {  
  4.     static {  
  5.         System.out.println("SuperClass init.");  
  6.     }  
  7.   
  8.     /** 
  9.      * 引用v1时,会初始化SuperClass 
  10.      */  
  11.     public static int v1 = 1;  
  12.       
  13.     /** 
  14.      * 引用F_V1时,不会初始化SuperClass 
  15.      * static final的变量,已经在编译器放到了常量池里 
  16.      */  
  17.     public static final int F_V1 = 1;  
  18. }  

SubClass:

 

[html] view plain copy
  1. package com.xuefeng.jvm.load;  
  2.   
  3. /**  
  4.  *   
  5.  * @author xuefeng  
  6.  *  
  7.  */  
  8. public class SubClass extends SuperClass {  
  9.     static {  
  10.         System.out.println("SubClass init.");  
  11.     }  
  12. }  


版权声明:本文为博主原创文章,未经博主允许不得转载。

你可能感兴趣的:(Java虚拟机 类初始化 阶段)