如下圖所示,Java的類加載機制主要分為三個部分,分別為加載、鏈接、初始化。其中鏈接又分為三個小部分——驗證、准備、解析。
- **加載**——在經過對Java代碼進行編譯后,JVM將Java類編譯后的二進制文件即字節碼文件以二進制的形式加載到內存放中,以便后面的步驟進行,如果沒有找到指定的類,就會拋出錯誤,進程到這里也就結束了。 - **驗證**——驗證即驗證Java加載進內存的二進制文件是否符合JVM以及Java規范,並且不會危害虛擬機的自身安全。比如說符號引用中的類、字段、方法的訪問性(private、protected、public、default)是否可被當前類訪問、類中的字段、方法是否與父類產生矛盾…… - **准備**——准備階段是指准備要執行的制定的類,這包含了給這個類的靜態變量和其他數據分配內存空間(**僅僅是分配內存空間,具體初始化在最后一步**)。 - **解析**——解析階段是指檢查指定的類是否引用了其他的類、接口,然后**對於這些內容遞歸的進行以上加載、驗證、准備三個步驟**。 - **初始化**——在這最后一步中,JVM用賦值或者缺省值將靜態變量進行初始化,並執行靜態初始化程序(static塊中的代碼),初始化發生在執行main方法之前,但在指定的類初始化之前他的父類必須先初始化,若其父類仍然存在父類,那也需遞歸的初始化。 例如,如果一個類中包含聲明`public static int a=5;`那么變量a被賦值為5的過程將在**初始化**階段進行,另外倘若靜態變量並沒有指定初值,那么JVM會自動給靜態變量賦予一個初值,下表給出Java基本類型和引用變量的缺省值。
類型 | 默認值 | 類型 | 默認值 | 類型 | 默認值 |
---|---|---|---|---|---|
boolean | false | int | 0 | float | 0.0f |
byte | 0 | long | 0L | double | 0.0d |
short | 0 | char | \u0000 | object reference | null |
參考資料: Java編程指南 http://www.importnew.com/25295.html