在Java代碼中,類型的加載,連接與初始化過程都是在程序運(yùn)行期間完成了,提供了更大的靈活性,增加更多的可能性。
加載:查找并加載類的二級制數(shù)據(jù)。類的加載指的是將類的。class文件中的二進(jìn)制數(shù)據(jù)讀入到內(nèi)存? ? ? ? ? ? ?中,將其放在運(yùn)行時(shí)數(shù)據(jù)區(qū)的方法區(qū)內(nèi),然后在內(nèi)存中創(chuàng)建一個(gè)java.lang.Class對象(規(guī)范并? ? ? ? ? ? ?未說明Class對象位于哪里,HotSpot虛擬機(jī)將其放在了方法區(qū)內(nèi))用來封裝類在方法區(qū)內(nèi)的? ? ? ? ? ? ? ?數(shù)據(jù)結(jié)構(gòu)
-連接:
? ? ? ? -驗(yàn)證:確保被加載的類的正確性。
-準(zhǔn)備:為類的靜態(tài)變量分配內(nèi)存,并將其初始化為默認(rèn)值。
? ? ? ? ?-解析:把類中的符號引用轉(zhuǎn)換為直接引用。
-初始化:為類的靜態(tài)變量賦予正確的初始化值。
? ?-使用
? ?-卸載
Java程序中對類的使用方式可分為兩種主動使用和?被動使用
主動使用:
? ? ? ? 1.創(chuàng)建類的實(shí)例子。
? ? ? ? ?2.訪問某個(gè)類或接口的靜態(tài)變量,或者對該靜態(tài)變量賦值。
? ? ? ? ?3.調(diào)用類的靜態(tài)方法。
? ? ? ? ?4.反射(如Class.forName("com.test.Test"))。
? ? ? ? ?5.初始化一個(gè)類的子類。
? ? ? ? ?6.Java虛擬機(jī)啟動時(shí)被標(biāo)明為啟動類的類(Java Test)。
? ? ? ? ?7.JDK1.7開始的動態(tài)語言支持:java.lang.invoke.MethodHandle實(shí)例解析結(jié)果? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? REF_getStatic,REF_putStatic,REF_invokeStatic句柄對應(yīng)的類沒有初始化則初始化
除了以上7中情況,其他使用Java類的方式都被看作是對類的被動使用,都不會導(dǎo)致類的初始化。
所有的Java虛擬機(jī)實(shí)現(xiàn)必須在每個(gè)類或接口中被Java程序“首次主動使用”的時(shí)候才初始化它們
Java虛擬機(jī)與程序的生命周期:在如下幾種情況下,Java虛擬機(jī)將結(jié)束生命周期。
? ? 1.執(zhí)行了System.exit()方法。
? ? 2.程序正常執(zhí)行結(jié)束
? ? 3. 程序在執(zhí)行過程中遇到了異常或錯(cuò)誤而異常終止。
? ? 4.由于操作系統(tǒng)出現(xiàn)錯(cuò)誤而導(dǎo)致Java虛擬機(jī)進(jìn)程終止。