Java類加載連接和初始化原理解析
1、當程序使用某個類時,JVM將會完成以下這三個步驟
2、連接
1)驗證
驗證是否是合法的字節碼文件。驗證JDK版本是否正確等。
2)準備
給成員變量(類變量/靜態變量)賦默認值
把常量(final)等值在方法區的常量池中給準備好。
3)解析
虛擬機常量池內的符號引用(常量名)替換為引用(地址)的過程
3、初始化<clinit> 類初始化
<clinit> 類初始化由兩部分組成:
(1)靜態變量的顯示初始化代碼,賦值代碼
(2)靜態代碼塊
(1) 和 (2) 的順序從上往下
當一個類初始化時,發現他的父類沒有初始化,會先初始化父類。
每一個類只會初始化一次,并且初始化的過程時線程安全的。
哪些操作會導致類的初始化?這句話的意思是:類的加載不一定就會發生類初始化。
- 以下操作會發生類初始化:
1)main方法所在的類加載時
2)new一個類的對象時
3)調用該類的靜態變量(final的常量除外) 和 靜態方法時
4)使用 java.lang.reflect 包的方法對類進行反射調用時
5)當初始化一個類,如果其父類沒有被初始化,則先會初始化他的父類
- 以下操起不會發生類的初始化:
1)引用靜態常量不會觸發此類的初始化(常量在連接階段就存入了方法區的常量池中)
2)當訪問一個靜態域時,只有真正聲明這個域的類才會被初始化
當通過子類引用父類的靜態變量,不會導致子類初始化
3)通過數組定義類引用,不會觸發此類的初始化
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。
相關文章:
