Java類加載連接和初始化原理解析
1、當(dāng)程序使用某個(gè)類時(shí),JVM將會完成以下這三個(gè)步驟
2、連接
1)驗(yàn)證
驗(yàn)證是否是合法的字節(jié)碼文件。驗(yàn)證JDK版本是否正確等。
2)準(zhǔn)備
給成員變量(類變量/靜態(tài)變量)賦默認(rèn)值
把常量(final)等值在方法區(qū)的常量池中給準(zhǔn)備好。
3)解析
虛擬機(jī)常量池內(nèi)的符號引用(常量名)替換為引用(地址)的過程
3、初始化<clinit> 類初始化
<clinit> 類初始化由兩部分組成:
(1)靜態(tài)變量的顯示初始化代碼,賦值代碼
(2)靜態(tài)代碼塊
(1) 和 (2) 的順序從上往下
當(dāng)一個(gè)類初始化時(shí),發(fā)現(xiàn)他的父類沒有初始化,會先初始化父類。
每一個(gè)類只會初始化一次,并且初始化的過程時(shí)線程安全的。
哪些操作會導(dǎo)致類的初始化?這句話的意思是:類的加載不一定就會發(fā)生類初始化。
- 以下操作會發(fā)生類初始化:
1)main方法所在的類加載時(shí)
2)new一個(gè)類的對象時(shí)
3)調(diào)用該類的靜態(tài)變量(final的常量除外) 和 靜態(tài)方法時(shí)
4)使用 java.lang.reflect 包的方法對類進(jìn)行反射調(diào)用時(shí)
5)當(dāng)初始化一個(gè)類,如果其父類沒有被初始化,則先會初始化他的父類
- 以下操起不會發(fā)生類的初始化:
1)引用靜態(tài)常量不會觸發(fā)此類的初始化(常量在連接階段就存入了方法區(qū)的常量池中)
2)當(dāng)訪問一個(gè)靜態(tài)域時(shí),只有真正聲明這個(gè)域的類才會被初始化
當(dāng)通過子類引用父類的靜態(tài)變量,不會導(dǎo)致子類初始化
3)通過數(shù)組定義類引用,不會觸發(fā)此類的初始化
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. 用xslt+css讓RSS顯示的跟網(wǎng)頁一樣漂亮2. HTML5 Canvas繪制圖形從入門到精通3. 《CSS3實(shí)戰(zhàn)》筆記--漸變設(shè)計(jì)(一)4. 讀大數(shù)據(jù)量的XML文件的讀取問題5. 讓chatgpt將html中的圖片轉(zhuǎn)為base64方法示例6. 詳解JSP 內(nèi)置對象request常見用法7. html5手機(jī)觸屏touch事件介紹8. CSS3實(shí)現(xiàn)動態(tài)翻牌效果 仿百度貼吧3D翻牌一次動畫特效9. 測試模式 - XSL教程 - 510. JSP的Cookie在登錄中的使用
