JAVA基礎-子類繼承父類實例化對象過程


之前在項目中碰到這樣一個問題:

  類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:內部類對外部類屬性的調用情況-內部類在使用外部類成員的時候,構造內部類時,會自動給內部類添加外部類的應用,內部類就是通過這個引用調用的外部類中的方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM