劃重點:
1.static所定義的對象只會被初始化一次抡四;
2.static初始化發(fā)生之處类垦,同時也是類初次使用之處褐缠;
3.類只有在初次被使用時才加載;
4.所有static對象及static代碼段會在加載時依程序中書寫順序依次初始化岛都。
接下來律姨,我們寫一個Demo,驗證一下:
首先疗绣,創(chuàng)建一個父類Clothes
然后线召,創(chuàng)建Jacket類铺韧,繼承于Clothes
從代碼可以看出多矮,線程啟動,首先會訪問執(zhí)行Jacket類中static修飾的main方法哈打,于是加載器開始啟動塔逃,并尋找加載Jacket.class,在這一過程中料仗,編譯器會發(fā)現(xiàn)它有一個父類湾盗,也稱基類。如果Clothes還有父的話立轧,編譯器會繼續(xù)向上找格粪,因為導(dǎo)出類(子類)的static初始化可能會依賴于基類中成員是否會被正確初始化躏吊。
自根基開始向下擴散加載完成后,就可以創(chuàng)建對象了帐萎。
對象中所有基本類型成員被賦予默認值比伏,對象成員引用被指向為null,然后基類構(gòu)造器被調(diào)用疆导,類似于上述加載順序赁项,實例變量被逐步初始化。
從執(zhí)行結(jié)果來看澈段,確實如此悠菜。
大家可能會發(fā)現(xiàn),通常在沒有主線程作為入口的類中败富,在調(diào)用構(gòu)造器的時候悔醋,就完成了類的加載;這是因為構(gòu)造器本身就是一個含有隱式static的方法兽叮,所以文章開頭的說法是沒錯的篙顺。