Java類(lèi)加載連接和初始化原理解析
1、當(dāng)程序使用某個(gè)類(lèi)時(shí),JVM將會(huì)完成以下這三個(gè)步驟
2、連接
1)驗(yàn)證
驗(yàn)證是否是合法的字節(jié)碼文件。驗(yàn)證JDK版本是否正確等。
2)準(zhǔn)備
給成員變量(類(lèi)變量/靜態(tài)變量)賦默認(rèn)值
把常量(final)等值在方法區(qū)的常量池中給準(zhǔn)備好。
3)解析
虛擬機(jī)常量池內(nèi)的符號(hào)引用(常量名)替換為引用(地址)的過(guò)程
3、初始化<clinit> 類(lèi)初始化
<clinit> 類(lèi)初始化由兩部分組成:
(1)靜態(tài)變量的顯示初始化代碼,賦值代碼
(2)靜態(tài)代碼塊
(1) 和 (2) 的順序從上往下
當(dāng)一個(gè)類(lèi)初始化時(shí),發(fā)現(xiàn)他的父類(lèi)沒(méi)有初始化,會(huì)先初始化父類(lèi)。
每一個(gè)類(lèi)只會(huì)初始化一次,并且初始化的過(guò)程時(shí)線(xiàn)程安全的。
哪些操作會(huì)導(dǎo)致類(lèi)的初始化?這句話(huà)的意思是:類(lèi)的加載不一定就會(huì)發(fā)生類(lèi)初始化。
- 以下操作會(huì)發(fā)生類(lèi)初始化:
1)main方法所在的類(lèi)加載時(shí)
2)new一個(gè)類(lèi)的對(duì)象時(shí)
3)調(diào)用該類(lèi)的靜態(tài)變量(final的常量除外) 和 靜態(tài)方法時(shí)
4)使用 java.lang.reflect 包的方法對(duì)類(lèi)進(jìn)行反射調(diào)用時(shí)
5)當(dāng)初始化一個(gè)類(lèi),如果其父類(lèi)沒(méi)有被初始化,則先會(huì)初始化他的父類(lèi)
- 以下操起不會(huì)發(fā)生類(lèi)的初始化:
1)引用靜態(tài)常量不會(huì)觸發(fā)此類(lèi)的初始化(常量在連接階段就存入了方法區(qū)的常量池中)
2)當(dāng)訪(fǎng)問(wèn)一個(gè)靜態(tài)域時(shí),只有真正聲明這個(gè)域的類(lèi)才會(huì)被初始化
當(dāng)通過(guò)子類(lèi)引用父類(lèi)的靜態(tài)變量,不會(huì)導(dǎo)致子類(lèi)初始化
3)通過(guò)數(shù)組定義類(lèi)引用,不會(huì)觸發(fā)此類(lèi)的初始化
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. php使用正則驗(yàn)證密碼字段的復(fù)雜強(qiáng)度原理詳細(xì)講解 原創(chuàng)2. asp.net core 認(rèn)證和授權(quán)實(shí)例詳解3. Jsp+Servlet實(shí)現(xiàn)文件上傳下載 文件列表展示(二)4. XML在語(yǔ)音合成中的應(yīng)用5. ASP.NET MVC使用Boostrap實(shí)現(xiàn)產(chǎn)品展示、查詢(xún)、排序、分頁(yè)6. 基于PHP做個(gè)圖片防盜鏈7. 基于javaweb+jsp實(shí)現(xiàn)企業(yè)車(chē)輛管理系統(tǒng)8. ASP.NET MVC把數(shù)據(jù)庫(kù)中枚舉項(xiàng)的數(shù)字轉(zhuǎn)換成文字9. jscript與vbscript 操作XML元素屬性的代碼10. ASP將數(shù)字轉(zhuǎn)中文數(shù)字(大寫(xiě)金額)的函數(shù)
