總體:
??對(duì)于靜態(tài)變量淑廊、靜態(tài)初始化塊逗余、變量、初始化塊季惩、構(gòu)造器录粱,它們的初始化順序依次是:
? ? ? ? (靜態(tài)變量、靜態(tài)初始化塊)>(變量画拾、初始化塊)>構(gòu)造器啥繁。
?單個(gè)類
結(jié)果:
1 靜態(tài)變量
2 靜態(tài)初始化塊
3 變量
4 初始化塊
5 構(gòu)造器
存在繼承的情況
輸出
父類--靜態(tài)變量
父類--靜態(tài)初始化塊
子類--靜態(tài)變量
子類--靜態(tài)初始化塊
子類main方法
父類--變量
父類--初始化塊
父類--構(gòu)造器
i=9, j=0
子類--變量
子類--初始化塊
子類--構(gòu)造器
i=9,j=20
子類的靜態(tài)變量和靜態(tài)初始化塊的初始化是在父類的變量、初始化塊和構(gòu)造器初始化之前就完成了青抛。靜態(tài)變量旗闽、靜態(tài)初始化塊,變量蜜另、初始化塊初始化了順序取決于它們?cè)陬愔谐霈F(xiàn)的先后順序适室。
分析
(1)訪問SubClass.main(),(這是一個(gè)static方法),于是裝載器就會(huì)為你尋找已經(jīng)編譯的SubClass類的代碼(也就是SubClass.class文件)举瑰。在裝載的過程中捣辆,裝載器注意到它有一個(gè)基類(也就是extends所要表示的意思),于是它再裝載基類此迅。不管你創(chuàng)不創(chuàng)建基類對(duì)象汽畴,這個(gè)過程總會(huì)發(fā)生。如果基類還有基類耸序,那么第二個(gè)基類也會(huì)被裝載忍些,依此類推。
(2)執(zhí)行根基類的static初始化佑吝,然后是下一個(gè)派生類的static初始化坐昙,依此類推绳匀。這個(gè)順序非常重要芋忿,因?yàn)榕缮惖摹皊tatic初始化”有可能要依賴基類成員的正確初始化炸客。
(3)當(dāng)所有必要的類都已經(jīng)裝載結(jié)束,開始執(zhí)行main()方法體戈钢,并用new SubClass()創(chuàng)建對(duì)象痹仙。
(4)類SubClass存在父類,則調(diào)用父類的構(gòu)造函數(shù)殉了,你可以使用super來指定調(diào)用哪個(gè)構(gòu)造函數(shù)开仰。基類的構(gòu)造過程以及構(gòu)造順序薪铜,同派生類的相同众弓。首先基類中各個(gè)變量按照字面順序進(jìn)行初始化,然后執(zhí)行基類的構(gòu)造函數(shù)的其余部分隔箍。
(5)對(duì)子類成員數(shù)據(jù)按照它們聲明的順序初始化谓娃,執(zhí)行子類構(gòu)造函數(shù)的其余部分。