jvm筆記 - 01類載入器深入解析與階段分解
jvm筆記 - 02類的載入、連線、始化過程詳解
前面兩篇內容,介紹了類的載入、連線、初始化,及主動使用類的場景。
靜態變數counter2的宣告賦值,在構造方法前面
package com.test;
public
class
mytest6
}class
singleton
public
static singleton getinstance()
}
執行結果為:
執行結果分析:
① main()方法中,"singleton.getinstance()"呼叫了singleton的靜態方法,是對singleton的主動使用
public
class
mytest6
}
② 對singleton的主動使用,會初始化singleton。
在初始化singleton之前,會先載入、連線singleton
③ 連線singleton,具體分為3個步驟:驗證 -> 準備 -> 解析
④ 在連線的準備階段,為會singleton的靜態變數分配記憶體,並將靜態變數初始化為預設值。
準備階段完成後,singleton的靜態變數的狀態如下
//int的預設值為0
counter1 =0;
counter2 =0;
//引用型別的預設值為null
singleton = null;
⑤ 在初始化階段,會為singleton的靜態變數賦予正確的初始值。
初始化的順序,就是**編寫的順序。
class
singleton
}
第1步,初始化counter1,因為**中沒有為counter1設定具體的數值,所以counter1的值仍然是準備階段的預設值,即0
第2步,初始化counter2,因為**中給counter2賦值為0,所以counter2的值是**中設定的值,即0
第3步,初始化singleton,初始化singleton會執行建構函式。
在建構函式中,對counter1、counter2分別進行了自增1的操作,所以建構函式執行完成後,counter1值有0變為了1、counter2的值由0變為了1
⑥ 所以,main()方法中,列印counter1、counter2的值,得到的結果分別為 counter1 = 1,counter2 = 1
靜態變數counter2的宣告賦值,在構造方法後面
package com.test;
public
class
mytest6
}class
singleton
//在建構函式的後面
public
static
int counter2 =0;
public
static singleton getinstance()
}
執行結果為:
執行結果分析:
①、②、③、④,案例1和案例2是相同的
⑤ 在初始化階段,會為singleton的靜態變數賦予正確的初始值。
初始化的順序,就是**編寫的順序。
class
singleton
//在建構函式的後面
public
static
int counter2 =0;
public
static singleton getinstance()
}
第1步,初始化counter1,因為**中沒有為counter1設定具體的數值,所以counter1的值仍然是準備階段的預設值,即0
第2步,初始化singleton,初始化singleton會執行建構函式。
在建構函式中,對counter1、counter2分別進行了自增1的操作,所以建構函式執行完成後,counter1值由0變為了1、counter2的值由0變為了1
第3步,初始化counter2,因為**中給counter2賦值為0,所以counter2的值是**中設定的值,即0。
因為counter2的位置在建構函式的後面,
所以在執行建構函式後,counter2 = 1,在counter2初始化完成後,counter2 = 0
⑥ 所以,main()方法中,列印counter1、counter2的值,得到的結果分別為 counter1 = 1,counter2 = 0
JVM 五 類的初始化
7種主動使用和被動使用,會觸發類的初始化 當初始化類的時候,要求父類都已經被初始化,但是這條規則不適用於介面 inte ce public class test06 inte ce threadparent class threadchild implements threadparent在這個例子...
構造方法 類的初始化塊以及類字段的初始化順序
首先,以下 為何無法通過編譯?哪兒出錯了?public class test class foo 如果類提供了乙個自定義的構造方法,將導致系統不再提供預設構造方法。如果乙個類中既有初始化塊,又有構造方法,同時還設定了字段的初始值,誰說了算?class initializeblockclass pub...
非靜態類的靜態成員與非靜態成員的初始化順序
先執行下面一段 public class spooler static spooler public static spooler getspooler else public void print public static void printstatic 1.我們在用 spooler s ne...