以下情況會觸發類的初始化:
- 遇到new,getstatic,putstatic,invokestatic這4條指令;
- 使用java.lang.reflect包的方法對類進行反射調用;
- 初始化一個類的時候,如果發現其父類沒有進行過初始化,則先初始化其父類(注意!如果其父類是接口的話,則不要求初始化父類);
- 當虛擬機啟動時,用戶需要指定一個要執行的主類(包含main方法的那個類),虛擬機會先初始化這個主類;
- 當使用jdk1.7的動態語言支持時,如果一個java.lang.invoke.MethodHandle實例最后的解析結果REF_getstatic,REF_putstatic,REF_invokeStatic的方法句柄,並且這個方法句柄所對應的類沒有進行過初始化,則先觸發其類初始化;
以下情況不會觸發類的初始化:
- 同類子類引用父類的靜態字段,不會導致子類初始化。至於是否會觸發子類的加載和驗證,取決於虛擬機的具體實現;
- 通過數組定義來引用類,也不會觸發類的初始化;例如:People[] ps = new People[100];
- 引用一個類的常量也不會觸發類的初始化