jvm 關於初始化時 , 的呼叫。
阿新 • • 發佈:2019-02-07
在編譯生成class檔案時,會自動產生兩個方法,一個是類的初始化方法<clinit>, 另一個是例項的初始化方法<init>
<clinit>:在jvm第一次載入class檔案時呼叫,包括靜態變數初始化語句和靜態塊的執行
<init>:在例項創建出來的時候呼叫,包括呼叫new操作符;呼叫Class或java.lang.reflect.Constructor物件的newInstance()方法;呼叫任何現有物件的clone()方法;通過java.io.ObjectInputStream類的getObject()方法反序列化。
-
public
- static{
- System.out.println("-----.static---");
- }
- static T2 t2 = new T2();
- C t =new C();
- static String str = "ff";
- public T2(){System.out.println("-----...");}
- public static void main(String[] ages){
- String a = "hi";
- String s = "'"+a+"'";
-
String ni= T2.str;
- }
- }
- class C{
- static{System.out.println("----cccccc static-...");}
- }
這個是test類。下面是位元組碼
Java程式碼- {
- static T2 t2;
- C t;
- static java.lang.String str;
- public T2();<init>將相應的變數壓入<init>方法中
- Code:
- Stack=3, Locals=1, Args_size=1
- 0: aload_0
-
1: invokespecial #1
- 4: aload_0
- 5: new #2; //class C
- 8: dup
- 9: invokespecial #3; //Method C."<init>":()V
- 12: putfield #4; //Field t:LC;
- 15: getstatic #5; //Field java/lang/System.out:Ljava/io/PrintStream;
- 18: ldc #6; //String -----...
- 20: invokevirtual #7; //Method java/io/PrintStream.println:(Ljava/lang/Str
- ing;)V
- 23: return
- LineNumberTable:
- line 11: 0
- line 8: 4
- line 11: 15
- public static void main(java.lang.String[]);
- Code:
- Stack=2, Locals=4, Args_size=1
- 0: ldc #8; //String hi
- 2: astore_1
- 3: new #9; //class java/lang/StringBuilder
- 6: dup
- 7: invokespecial #10; //Method java/lang/StringBuilder."<init>":()V
- 10: ldc #11; //String '
- 12: invokevirtual #12; //Method java/lang/StringBuilder.append:(Ljava/lang
- /String;)Ljava/lang/StringBuilder;
- 15: aload_1
- 16: invokevirtual #12; //Method java/lang/StringBuilder.append:(Ljava/lang
- /String;)Ljava/lang/StringBuilder;
- 19: ldc #11; //String '
- 21: invokevirtual #12; //Method java/lang/StringBuilder.append:(Ljava/lang
- /String;)Ljava/lang/StringBuilder;
- 24: invokevirtual #13; //Method java/lang/StringBuilder.toString:()Ljava/l
- ang/String;
- 27: astore_2
- 28: getstatic #14; //Field str:Ljava/lang/String;
- 31: astore_3
- 32: return
- LineNumberTable:
- line 13: 0
- line 14: 3
- line 15: 28
- line 16: 32
- static {};
- Code:
- Stack=2, Locals=0, Args_size=0
- 0: getstatic #5; //Field java/lang/System.out:Ljava/io/PrintStream;
- 3: ldc #15; //String -----.static---
- 5: invokevirtual #7; //Method java/io/PrintStream.println:(Ljava/lang/Str
- ing;)V
- 8: new #16; //class T2
- 11: dup
- 12: invokespecial #17; //Method "<init>":()V//調了T2<init>方法
- 15: putstatic #18; //Field t2:LT2;
- 18: ldc #19; //String ff
- 20: putstatic #14; //Field str:Ljava/lang/String;
- 23: return
- LineNumberTable:
- line 5: 0
- line 7: 8
- line 9: 18
- }
- 沒註釋static T2 t2 = new T2();//調了T2<init>方法
- 結果:-----.static---
- ----cccccc static-...
- -----...
- {
- C t;
- static java.lang.String str;
- public T2();<init>將相應的變數壓入<init>方法中
- Code:
- Stack=3, Locals=1, Args_size=1
- 0: aload_0
- 1: invokespecial #1; //Method java/lang/Object."<init>":()V
- 4: aload_0
- 5: new #2; //class C
- 8: dup
- 9: invokespecial #3; //Method C."<init>":()V
- 12: putfield #4; //Field t:LC;
- 15: getstatic #5; //Field java/lang/System.out:Ljava/io/PrintStream;
- 18: ldc #6; //String -----...
- 20: invokevirtual #7; //Method java/io/PrintStream.println:(Ljava/lang/Str
- ing;)V
- 23: return
- LineNumberTable:
- line 11: 0
- line 8: 4
- line 11: 15
- public static void main(java.lang.String[]);
- Code:
- Stack=2, Locals=4, Args_size=1
- 0: ldc #8; //String hi
- 2: astore_1
- 3: new #9; //class java/lang/StringBuilder
- 6: dup
- 7: invokespecial #10; //Method java/lang/StringBuilder."<init>":()V
- 10: ldc #11; //String '
- 12: invokevirtual #12; //Method java/lang/StringBuilder.append:(Ljava/lang
- /String;)Ljava/lang/StringBuilder;
- 15: aload_1
- 16: invokevirtual #12; //Method java/lang/StringBuilder.append:(Ljava/lang
- /String;)Ljava/lang/StringBuilder;
- 19: ldc #11; //String '
- 21: invokevirtual #12; //Method java/lang/StringBuilder.append:(Ljava/lang
- /String;)Ljava/lang/StringBuilder;
- 24: invokevirtual #13; //Method java/lang/StringBuilder.toString:()Ljava/l
- ang/String;
- 27: astore_2
- 28: getstatic #14; //Field str:Ljava/lang/String;
- 31: astore_3
- 32: return
- LineNumberTable:
- line 13: 0
- line 14: 3
- line 15: 28
- line 16: 32
- static {};
- Code:
- Stack=2, Locals=0, Args_size=0
- 0: getstatic #5; //Field java/lang/System.out:Ljava/io/PrintStream;
- 3: ldc #15; //String -----.static---
- 5: invokevirtual #7; //Method java/io/PrintStream.println:(Ljava/lang/Str
- ing;)V
- 8: ldc #16; //String ff
- 10: putstatic #14; //Field str:Ljava/lang/String;
- 13: return
- LineNumberTable:
- line 5: 0
- line 9: 8
- }
- 註釋static T2 t2 = new T2(); 沒有t2的<init>方法
- 結果:-----.static---
總結:當一個類初始化的時候,先呼叫<cinit>方法 ,如果在<cinit>方法中遇到<init>方法。則先呼叫完<init>方法。然後在繼續執行<cinit>