hexdump -C demo.class
-XX:+TraceClassLoading
-Xverify:none
將「經過一個類的全限定名來獲取描述此類的二進制字節流」這個動做放到Java虛擬機外部去實現,以便讓應用程序本身決定如何去獲取所須要的類。java
一、加載 二、鏈接 |- 驗證 |- 準備 |- 解析 三、初始化 四、使用 五、卸載
加載:獲取二進制字節流,並存儲至方法區(文件格式驗證經過後才存儲)。數組
驗證:確保Class文件的字節流中包含的信息符合當前虛擬機的要求。微信
準備:在方法區中分配類變量的內存並設置類變量初始值(一般狀況下是零值)。模塊化
解析:虛擬機將常量池內的符號引用替換爲直接引用的過程。.net
初始化:執行類構造器<clinit>()方法的過程,前面都是由虛擬機主導和控制(自定義類加載除外),初始化纔是執行類中定義的字節碼。線程
補充:鏈接與加載是交叉的code
雙親委派 -> 委派雙親對象
工做過程: 若是一個類加載器收到了類加載的請求,將會把這個請求委派給父類加載器去完成(直到最頂級),當父加載器反饋本身沒法完成這個加載請求時,子加載器纔會嘗試本身去加載。接口
好處: Java類隨着它的類加載器一塊兒具有了一種帶有優先級的層次關係。生命週期
同一個類加載器下,一個類型只會初始化一次【有鎖機制】。
經過子類引用父類的靜態字段,不會致使子類的初始化。
經過數組定義來引用類,不會觸發此類的初始化。
static final修飾的,在編譯階段會存入調用類的常量池中,不須要類的初始化。
static 非final的,set與get時,須要觸發類的初始化。
接口與類的區別
https://my.oschina.net/gmarshal
歡迎關注個人我的微信訂閱號:(聽說這個頭像程序猿專用)