接口初始化和類初始化區別

虛擬機規範嚴格規定了有且只有四種情況必須立即對類進行初始化:
1. 遇到new、getstatic、putstatic、invokestatic這四條字節碼指令時,
如果類還沒有進行過初始化,則需要先觸發其初始化。
生成這四條指令最常見的Java代碼場景是:
使用new關鍵字實例化對象時、
讀取一個類的靜態字段(static)時(被static修飾又被final修飾的,已在編譯期把結果放入常量池的靜態字段除外)
設置一個類的靜態字段(static)時(被static修飾又被final修飾的,已在編譯期把結果放入常量池的靜態字段除外)
以及調用一個類的靜態方法時。
2. 使用Java.lang.refect包的方法對類進行反射調用時,如果類還沒有進行過初始化,則需要先觸發其初始化。
3. 當初始化一個類的時候,如果發現其父類還沒有進行初始化,則需要先觸發其父類的初始化。
4. 當虛擬機啓動時,用戶需要指定一個要執行的主類,虛擬機會先執行該主類。

對於靜態字段,只有直接定義這個字段的類纔會被初始化,因此,通過其子類來引用父類中定義的靜態字段,只會觸發父類的初始化而不會觸發子類的初始化

接口初始化與類初始化區別:
當一個類在初始化時,要求其父類全部已經初始化過了,
但是一個接口在初始化時,並不要求其父接口全部都完成了初始化,只有在真正使用到父接口的時候(如引用接口中定義的常量)
纔會初始化該父接口。
調用類中的static final常量時並不會觸發該類的初始化,但是調用接口中的static final常量時便會觸發該接口的初始化

發佈了180 篇原創文章 · 獲贊 335 · 訪問量 64萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章