類裝載過程,以及什麼時候會裝載一個類
阿新 • • 發佈:2019-01-08
類裝載過程
具體內容參考博文http://blog.csdn.net/lincolnmi/article/details/50538016 Java虛擬機器通過裝載、連線和初始化一個Java型別,使該型別可以被正在執行的Java程式所使用 --也就是說要想使用一個類,必然會經歷過上面的三個過程裝載時會做兩項檢查,雖然在驗證階段之前進行,但邏輯上屬於驗證階段。
- 驗證class檔案格式是否正確,如魔數,每個部分在正確位置,正確的長度,檔案的長度不是太長或太短等。 保證正式解析二進位制class檔案時候,不會造成虛擬機器的崩潰。
- 確保每個除Object之外每個類都有一個超類,載入某個類的時候,確保該類的所有超類必須載入。
注意:我們在java程式中new一個物件的時候,其實是訪問了類對應的Class物件,所以在多執行緒的時候,Synchronized(類名.class),其它執行緒就不能建立物件了。 二。連線 :連線的過程是將類初始化為jvm執行時可用的型別 連線分為驗證,準備,解析 1.驗證:確認它是否符合java的語義 ,如
- 檢查final的類不擁有子類
- 檢查final方法不能被覆蓋
- 確保型別和超型別之間沒有不相容的方法申明(比如兩個方法簽名完全一樣,但返回型別不同)
- 檢查所有的常量池入口相互之間保持一致(比如CONSTANT_String_info入口的string_index專案必須是一個CONSTANT_Utf8_info入口的索引)
- 檢查常量池中所有的特殊字串(類名,欄位名,方法名,欄位描述符和方法描述符)是否符合格式
- 檢查位元組碼的完整性
可以參考http://blog.csdn.net/qq_19740679/article/details/48133871 三。初始化 為類的靜態變數賦初始值 四。接下來我們討論一下具有繼承關係的類之間的類初始化(<clinit>)和物件初始化(<init>)之間的關係 上來給結論: 父類的靜態塊 > 子類的靜態塊 > 父類的構造快 > 子類的構造塊 廢話不說,上圖
解釋一下執行的過程:首先在test中遇見A,此時載入類A,這個時候遇見A繼承了B,載入B,同理再載入C,此時再進行初始化,從父類的靜態塊開始,然後是子類的靜態塊。 之後我們new了一個A物件,從父類的構造塊開始,然後是子類的構造快
所以說構造快包括:類的構造快,類的構造方法。執行順序:先執行類的構造塊,然後執行類的構造方法