JVM把class文件加載到內存,並對數據進行校驗、解析和初始化,最終造成JVM能夠直接使用的Java類型的過程。java
類加載的過程主要分爲三個部分:安全
加載數據結構
連接jvm
初始化.net
而連接又能夠細分爲三個小部分:對象
驗證blog
準備繼承
解析內存
簡單來講,加載指的是把class字節碼文件從各個來源經過類加載器裝載入內存中。get
將class文件字節碼內容加載到內存中,並將這些靜態數據轉換成方法區中的運行時數據結構,在堆中生成一個表明這個類的java.lang.Class對象,做爲方法區類數據的訪問入口。
(2)連接 將java類的二進制代碼合併到jvm的運行狀態之中的過程
確保加載的類信息符合jvm規範,沒有安全方面的問題。
正式爲類變量(static變量)分配內存並設置類變量初始值的階段,這些內存都將在方法區中進行分配。
特別須要注意,初值,不是代碼中具體寫的初始化的值,而是Java虛擬機根據不一樣變量類型的默認初始值。
好比8種基本類型的初值,默認爲0;引用類型的初值則爲null;常量的初值即爲代碼中設置的值,final static tmp = 456, 那麼該階段tmp的初值就是456
虛擬機常量池內的符號引用替換爲直接引用的過程。
(好比String s ="aaa",轉化爲 s的地址指向「aaa」的地址)
這個階段主要是對類變量初始化,是執行類構造器的過程。
換句話說,只對static修飾的變量或語句進行初始化。
若是初始化一個類的時候,其父類還沒有初始化,則優先初始化其父類。
若是同時包含多個靜態變量和靜態代碼塊,則按照自上而下的順序依次執行。
當訪問一個java類的靜態域時,只有真正聲明這個靜態變量的類纔會被初始化。