之前在項目中碰到這樣一個問題:
類B繼承了類A,B在實例化的時候,A的構造方法中調用了B的某個方法,並且B的方法中對B的成員屬性進行了初始化,然后最后得到的B對象的成員屬性為空。
代碼場景如下:
這里B new出來后s會被“s = null”覆蓋A中調用init的值,A中調用的方法若被子類覆蓋,那么構造過程中雖然是先構造A對象,但是A對像調用的方法卻是子對象的方法,然后調用B的代碼塊,構造方法。
這里為了不然S=null覆蓋原來的初始化值,我們可以去掉代碼塊中s的初始化過程。
我們來詳細分析下子類構造過程中,代碼的執行過程
圖例:
這是一個父子類的模型,中間有靜態代碼塊、初始化代碼塊、構造方法、成員方法,那么構造TT2()的過程如下:
new TT2()->new TT1()-> static tt1 1-> static tt1 2-> tt1List = new ...-> tt1 constructor->tt2 static tt2 1-> tt2 static tt2 2->list = null-> tt2 contructor->END
這樣可能不是太清晰,我們用圖來標注下:
輸出結果如下:
總結:累的加載過程不管多么復雜,總是按照-靜態代碼塊->普通代碼塊->構造方法,這個順序執行的,按照順序一步步分析,將程序結構捋清楚就能避免不必要的錯誤。
ps:內部類對外部類屬性的調用情況-內部類在使用外部類成員的時候,構造內部類時,會自動給內部類添加外部類的應用,內部類就是通過這個引用調用的外部類中的方法。