1. 程式人生 > >類裝載過程,以及什麼時候會裝載一個類

類裝載過程,以及什麼時候會裝載一個類

類裝載過程

具體內容參考博文http://blog.csdn.net/lincolnmi/article/details/50538016 Java虛擬機器通過裝載、連線和初始化一個Java型別,使該型別可以被正在執行的Java程式所使用 --也就是說要想使用一個類,必然會經歷過上面的三個過程

裝載時會做兩項檢查,雖然在驗證階段之前進行,但邏輯上屬於驗證階段。

  1. 驗證class檔案格式是否正確,如魔數,每個部分在正確位置,正確的長度,檔案的長度不是太長或太短等。 保證正式解析二進位制class檔案時候,不會造成虛擬機器的崩潰。
  2. 確保每個除Object之外每個類都有一個超類,載入某個類的時候,確保該類的所有超類必須載入。
但是對於載入順序: 載入當前類,如果發現當前類繼承了父類,那麼再載入父類。 廢話不說,上圖 一。裝載
注意:我們在java程式中new一個物件的時候,其實是訪問了類對應的Class物件,所以在多執行緒的時候,Synchronized(類名.class),其它執行緒就不能建立物件了。 二。連線 :連線的過程是將類初始化為jvm執行時可用的型別 連線分為驗證,準備,解析 1.驗證:確認它是否符合java的語義 ,如
  1. 檢查final的類不擁有子類
  2. 檢查final方法不能被覆蓋
  3. 確保型別和超型別之間沒有不相容的方法申明(比如兩個方法簽名完全一樣,但返回型別不同)
  4. 檢查所有的常量池入口相互之間保持一致(比如CONSTANT_String_info入口的string_index專案必須是一個CONSTANT_Utf8_info入口的索引)
  5. 檢查常量池中所有的特殊字串(類名,欄位名,方法名,欄位描述符和方法描述符)是否符合格式
  6. 檢查位元組碼的完整性
2.準備 在準備階段,java虛擬機器為類變數分配記憶體,並設定預設的初始值。在正式初始化之前,類變數都沒有被正式初始化為真正的初始值 3.解析 解析過程是在型別的常量池中尋找,類,介面,方法的符合引用,把這些符號引用,變成直接引用。解析這個過程什麼時候執行是虛擬機器自己決定的,可以在初始化階段後面執行。     解釋一下是什麼意思:廢話不說,上圖
可以參考http://blog.csdn.net/qq_19740679/article/details/48133871 三。初始化 為類的靜態變數賦初始值 四。接下來我們討論一下具有繼承關係的類之間的類初始化(<clinit>)和物件初始化(<init>)之間的關係 上來給結論:  父類的靜態塊  >  子類的靜態塊   >  父類的構造快    > 子類的構造塊 廢話不說,上圖





解釋一下執行的過程:首先在test中遇見A,此時載入類A,這個時候遇見A繼承了B,載入B,同理再載入C,此時再進行初始化,從父類的靜態塊開始,然後是子類的靜態塊。 之後我們new了一個A物件,從父類的構造塊開始,然後是子類的構造快
所以說構造快包括:類的構造快,類的構造方法。執行順序:先執行類的構造塊,然後執行類的構造方法