一個類的整個生命週期包括:加載,驗證,準備,解析,初始化,使用,卸載
初始化
- 運行過程中遇到如下字節碼指令時,如果類尚未初始化,那就要進行初始化:new、getstatic、putstatic、invokestatic等。這四個指定對應的Java代碼場景是:
new: 通過new創建對象;
getstatic,putstatic: 讀取、設置一個類的靜態成員變量(不包括final修飾的靜態變量);
invokestatic: 調用一個類的靜態方法; - 調用一個類的靜態變量
- 對類進行reflect反射調用,如果還沒初始化則進行初始化
- 如果父類還沒初始化,則初始化其父類
- 虛擬機啓動時,會先初始化main主類
主動引用和被動引用
直接滿足上述條件纔會初始化,被稱爲主動引用。
間接滿足上述情況不會初始化,被稱爲被動引用。
- 子類引用父類靜態字段
- 子類引用父類靜態方法
- 定義類的數組
- 調用類的常量 public static final