怎么認識Java從虛擬機角度分析類的實例化順序?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設,龍沙企業(yè)網(wǎng)站建設,龍沙品牌網(wǎng)站建設,網(wǎng)站定制,龍沙網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,龍沙網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。1、首先展示一下實例代碼(Son.java & Father.java)
public class Father { public static int a=10;//父類的靜態(tài)變量 static{//父類的靜態(tài)代碼塊 a=20; } {//父類的構造代碼塊 a=30; } public Father() {//父類的構造方法 a=40; } }
public class Son extends Father{ public static int s=10;//子類的靜態(tài)變量 public int k=20;//子類的實例變量 static{//子類的靜態(tài)代碼塊 s=20; } {//子類的構造代碼塊 s=30; } public Son() {//子類的構造函數(shù) s=40; } {//子類的構造代碼塊 s=50; } }
2、將son.java文件編譯為son.class文件,然后使用javap反編譯查看Son的字節(jié)碼指令來分析Son的加載順序,更利于理解(javap -v -c Son > p.txt)。
3、執(zhí)行代碼"new Son();"后,分析類的加載順序。
下面的static{};為
static {}; descriptor: ()V flags: ACC_STATIC Code: stack=1, locals=0, args_size=0 0: bipush 10 2: putstatic #11 // Field s:I--------------------------順序執(zhí)行靜態(tài)變量的賦值 5: bipush 20 7: putstatic #11 // Field s:I--------------------------順序執(zhí)行靜態(tài)代碼塊 10: return
public packet1020.Son(); descriptor: ()V flags: ACC_PUBLIC Code: stack=2, locals=1, args_size=1 0: aload_0 1: invokespecial #16 // Method packet1020/Father."":()V--------------------執(zhí)行父類的 函數(shù)(順序不變,第一個) 4: aload_0 5: bipush 20 7: putfield #18 // Field k:I------------------------------------------------按順序收集實例變量賦值 10: bipush 30 12: putstatic #11 // Field s:I------------------------------------------------按順序收集構造代碼塊 15: bipush 50 17: putstatic #11 // Field s:I------------------------------------------------按順序收集構造代碼塊 20: bipush 40 22: putstatic #11 // Field s:I------------------------------------------------最后執(zhí)行自己的構造函數(shù)代碼(順序不變,最后一個) 25: return
開始分析:
1.觸發(fā)類的加載,在初始化階段,先執(zhí)行父類
2.代碼中執(zhí)行了構造函數(shù),所以執(zhí)行
結論:
1.父類中順序執(zhí)行靜態(tài)變量賦值,靜態(tài)代碼塊
2.子類中順序執(zhí)行靜態(tài)變量賦值,靜態(tài)代碼塊
3.父類中順序執(zhí)行實例變量賦值,構造代碼塊
4.父類構造函數(shù)
5.子類中順序執(zhí)行實例變量賦值,構造代碼塊
6.子類構造函數(shù)
名字解釋:摘抄自周志明老師的《深入理解Java虛擬機:JVM高級特性與最佳實踐》
1.有且只有4中情況下必須對類進行初始化(執(zhí)行
2.
3.
構造代碼塊執(zhí)行順序先于構造函數(shù)
(){ 1.調用父類 方法 2.順序執(zhí)行實例變量的賦值操作和構造代碼塊 3.程序員自己的構造函數(shù)方法代碼 }
看完上述內容,你們掌握怎么認識Java從虛擬機角度分析類的實例化順序的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!