jvm 关于初始化时<cinit> , <init>的调用。

来源:互联网 发布:网络光纤传输器 编辑:程序博客网 时间:2024/06/16 06:27

在编译生成class文件时,会自动产生两个方法,一个是类的初始化方法<clinit>, 另一个是实例的初始化方法<init>


<clinit>:在jvm第一次加载class文件时调用,包括静态变量初始化语句和静态块的执行

<init>:在实例创建出来的时候调用,包括调用new操作符;调用Class或java.lang.reflect.Constructor对象的newInstance()方法;调用任何现有对象的clone()方法;通过java.io.ObjectInputStream类的getObject()方法反序列化。

  1. public class T2{  
  2. static{  
  3.    System.out.println("-----.static---");  
  4.    }  
  5.    static T2 t2 = new T2();  
  6.    C t =new C();  
  7.    static String str = "ff";   
  8.      
  9.    public T2(){System.out.println("-----...");}  
  10.   public static void main(String[] ages){  
  11.    String a = "hi";  
  12.     String s = "'"+a+"'";  
  13.     String ni= T2.str;  
  14.    }  
  15. }  
  16. class C{  
  17.  static{System.out.println("----cccccc  static-...");}  
  18. }  

   这个是test类。下面是字节码

Java代码  收藏代码
  1. {  
  2. static T2 t2;  
  3.   
  4. C t;  
  5.   
  6. static java.lang.String str;  
  7.   
  8. public T2();<init>将相应的变量压入<init>方法中  
  9.   Code:  
  10.    Stack=3, Locals=1, Args_size=1  
  11.    0:   aload_0  
  12.    1:   invokespecial   #1//Method java/lang/Object."<init>":()V  
  13.    4:   aload_0  
  14.    5:   new     #2//class C  
  15.    8:   dup  
  16.    9:   invokespecial   #3//Method C."<init>":()V  
  17.    12:  putfield        #4//Field t:LC;  
  18.    15:  getstatic       #5//Field java/lang/System.out:Ljava/io/PrintStream;  
  19.    18:  ldc     #6//String -----...  
  20.    20:  invokevirtual   #7//Method java/io/PrintStream.println:(Ljava/lang/Str  
  21. ing;)V  
  22.    23:  return  
  23.   LineNumberTable:  
  24.    line 110  
  25.    line 84  
  26.    line 1115  
  27.   
  28.   
  29. public static void main(java.lang.String[]);  
  30.   Code:  
  31.    Stack=2, Locals=4, Args_size=1  
  32.    0:   ldc     #8//String hi  
  33.    2:   astore_1  
  34.    3:   new     #9//class java/lang/StringBuilder  
  35.    6:   dup  
  36.    7:   invokespecial   #10//Method java/lang/StringBuilder."<init>":()V  
  37.    10:  ldc     #11//String '  
  38.    12:  invokevirtual   #12//Method java/lang/StringBuilder.append:(Ljava/lang  
  39. /String;)Ljava/lang/StringBuilder;  
  40.    15:  aload_1  
  41.    16:  invokevirtual   #12//Method java/lang/StringBuilder.append:(Ljava/lang  
  42. /String;)Ljava/lang/StringBuilder;  
  43.    19:  ldc     #11//String '  
  44.    21:  invokevirtual   #12//Method java/lang/StringBuilder.append:(Ljava/lang  
  45. /String;)Ljava/lang/StringBuilder;  
  46.    24:  invokevirtual   #13//Method java/lang/StringBuilder.toString:()Ljava/l  
  47. ang/String;  
  48.    27:  astore_2  
  49.    28:  getstatic       #14//Field str:Ljava/lang/String;  
  50.    31:  astore_3  
  51.    32:  return  
  52.   LineNumberTable:  
  53.    line 130  
  54.    line 143  
  55.    line 1528  
  56.    line 1632  
  57.   
  58.   
  59. static {};  
  60.   Code:  
  61.    Stack=2, Locals=0, Args_size=0  
  62.    0:   getstatic       #5//Field java/lang/System.out:Ljava/io/PrintStream;  
  63.    3:   ldc     #15//String -----.static---  
  64.    5:   invokevirtual   #7//Method java/io/PrintStream.println:(Ljava/lang/Str  
  65. ing;)V  
  66.    8:   new     #16//class T2  
  67.    11:  dup  
  68.    12:  invokespecial   #17//Method "<init>":()V//调了T2<init>方法  
  69.    15:  putstatic       #18//Field t2:LT2;  
  70.    18:  ldc     #19//String ff  
  71.    20:  putstatic       #14//Field str:Ljava/lang/String;  
  72.    23:  return  
  73.   LineNumberTable:  
  74.    line 50  
  75.    line 78  
  76.    line 918  
  77.   
  78.   
  79. }  
  80.   
  81. 没注释static T2 t2 = new T2();//调了T2<init>方法  
  82. 结果:-----.static---  
  83. ----cccccc  static-...  
  84. -----...  
  85.   
  86. {  
  87. C t;  
  88.   
  89. static java.lang.String str;  
  90.   
  91. public T2();<init>将相应的变量压入<init>方法中  
  92.   Code:  
  93.    Stack=3, Locals=1, Args_size=1  
  94.    0:   aload_0  
  95.    1:   invokespecial   #1//Method java/lang/Object."<init>":()V  
  96.    4:   aload_0  
  97.    5:   new     #2//class C  
  98.    8:   dup  
  99.    9:   invokespecial   #3//Method C."<init>":()V  
  100.    12:  putfield        #4//Field t:LC;  
  101.    15:  getstatic       #5//Field java/lang/System.out:Ljava/io/PrintStream;  
  102.    18:  ldc     #6//String -----...  
  103.    20:  invokevirtual   #7//Method java/io/PrintStream.println:(Ljava/lang/Str  
  104. ing;)V  
  105.    23:  return  
  106.   LineNumberTable:  
  107.    line 110  
  108.    line 84  
  109.    line 1115  
  110.   
  111.   
  112. public static void main(java.lang.String[]);  
  113.   Code:  
  114.    Stack=2, Locals=4, Args_size=1  
  115.    0:   ldc     #8//String hi  
  116.    2:   astore_1  
  117.    3:   new     #9//class java/lang/StringBuilder  
  118.    6:   dup  
  119.    7:   invokespecial   #10//Method java/lang/StringBuilder."<init>":()V  
  120.    10:  ldc     #11//String '  
  121.    12:  invokevirtual   #12//Method java/lang/StringBuilder.append:(Ljava/lang  
  122. /String;)Ljava/lang/StringBuilder;  
  123.    15:  aload_1  
  124.    16:  invokevirtual   #12//Method java/lang/StringBuilder.append:(Ljava/lang  
  125. /String;)Ljava/lang/StringBuilder;  
  126.    19:  ldc     #11//String '  
  127.    21:  invokevirtual   #12//Method java/lang/StringBuilder.append:(Ljava/lang  
  128. /String;)Ljava/lang/StringBuilder;  
  129.    24:  invokevirtual   #13//Method java/lang/StringBuilder.toString:()Ljava/l  
  130. ang/String;  
  131.    27:  astore_2  
  132.    28:  getstatic       #14//Field str:Ljava/lang/String;  
  133.    31:  astore_3  
  134.    32:  return  
  135.   LineNumberTable:  
  136.    line 130  
  137.    line 143  
  138.    line 1528  
  139.    line 1632  
  140.   
  141.   
  142. static {};  
  143.   Code:  
  144.    Stack=2, Locals=0, Args_size=0  
  145.    0:   getstatic       #5//Field java/lang/System.out:Ljava/io/PrintStream;  
  146.    3:   ldc     #15//String -----.static---  
  147.    5:   invokevirtual   #7//Method java/io/PrintStream.println:(Ljava/lang/Str  
  148. ing;)V  
  149.    8:   ldc     #16//String ff  
  150.    10:  putstatic       #14//Field str:Ljava/lang/String;  
  151.    13:  return  
  152.   LineNumberTable:  
  153.    line 50  
  154.    line 98  
  155.   
  156.   
  157. }  
  158.   
  159.   
  160. 注释static T2 t2 = new T2(); 没有t2的<init>方法  
  161. 结果:-----.static---  

 

总结:当一个类初始化的时候,先调用<cinit>方法 ,如果在<cinit>方法中遇到<init>方法。则先调用完<init>方法。然后在继续执行<cinit>


1 0
原创粉丝点击