今天我總結了一下java中靜態代碼塊 構造代碼塊 構造方法的執行順序及其注意問題
首先要知道靜態代碼塊是隨着類的加載而加載,而構造代碼塊和構造方法都是隨着對象的創建而加載
當時做了這么一個小案例(想必這個大多數學java的都做過,不知道是否都理解了)
class Fu{ static { System.out.println("Fu static code"); } { System.out.println("Fu code"); } public Fu(){ System.out.println("Fu GouZao"); } } class Zi extends Fu{ static { System.out.println("Zi static code"); } { System.out.println("Zi code"); } public Zi(){ System.out.println("Zi GouZao"); } } public class Text{ public static void main(String[] args) { Zi zi = new Zi(); } }
1,在編譯Text.java時,先加載了Fu類,因此Fu類的靜態代碼塊首先執行,而后加載Zi類,Zi類的靜態代碼塊執行,這沒什么好說的
2,然后創建Zi的對象,大家都知道構造代碼塊優先於構造方法執行,這時候問題來了,這時應該先看Zi類的構造方法,Zi類里的構造方法里有一句隱式的super()首先被執行,所以找到Fu類的構造方法,而Fu類的構造方法中也有一句隱式的super()執行(調用Object類的構造方法),並沒有什么返回結果,接下來才是在執行Fu類構造方法的方法體前先執行了Fu類的構造代碼塊(Fu code),再執行Fu類構造方法的方法體(也就是Fu GouZao),最后又回到Zi類的構造方法中,這時Zi類的super()已經執行完了,在執行Zi類構造方法的方法體前先執行Zi類的構造代碼塊(Zi code),再執行Zi類構造方法的方法體(Zi GouZao)
最后的結果是:
Fu static code Zi static code Fu code Fu GouZao Zi code Zi GouZao
不知道大家繞暈了沒有,我在這再總結一下:靜態的是與類有關,肯定先加載,而構造代碼塊執行前要先看構造方法中是否有this()或super(),有的話在其之后執行,最后執行構造方法的方法體
(有理解不對的地方還請大家指點,一起交流探討)