一個對象的實例化過程【重點】


一、過程
  Person p = new Person();
  1,JVM會去讀取指定路徑下的Person.class文件,並加載進內存,
    並會先加載Person的父類(如果有直接父類的情況下)
  2,在堆內存中開辟空間,分配地址。
  3,並在對象空間中,對對象中的屬性進行默認初始化
  4,調用對應的構造函數,進行初始化
  5,在構造函數中,第一行會先調用父類中的構造函數進行初始化。
  6,父類初始化完畢后,再對子類的屬性,進行顯示初始化。
  7,指定構造函數的特定初始化
  8,初始化完畢后,將堆內存中的地址值賦給引用變量。
  
  即:過程為:
   子類屬性默認初始化==》父類構造函數初始化==》子類屬性顯示初始化!!!
   
二、特點:
  在子類構造對象時,發現,訪問子類構造函數時,父類也運行了。
    一】具體:
      在子類的構造函數中第一行有一個默認的隱式語句。 super();
      但是,當自己在子類構造函數中寫了一個super的構造語句,則就不會自動調用了。
    
    注意:當父類中構造函數為Fu(int x)時,
       子類中則必須用super(6);否則報錯!
       
    子類的實例化過程中:
     子類中所有的構造函數默認都會訪問父類中的空參數構造函數。
     
     
    二】【重點】為什么子類實例化的時候要訪問父類中的構造函數?
     1》子類繼承了父類,獲取到了父類中的內容(屬性),所以在使用父類內容之前
       要先看父類是如何對自己的內容進行初始化的。
        所以子類在構造對象時,就必須訪問父類中的構造函數,因此要在子類的構造函數中加入super語句。
     
     2》如果父類中沒有定義空構造函數,那么子類的構造函數必須用super明確調用父類中對應的構造函數
     
     3》子類構造函數中如果使用this調用了本類構造函數時,則調用this的這個構造函數中super便沒有了,
        因為super和this都只能定義在第一行。
        但是可以保證的是,子類中肯定會有其它的構造函數訪問父類的構造函數。
        
     注:super語句必須要定義在子類構造函數的第一行。因為父類的初始化動作要先完成。
     
     注:java所有的類都是Objiect的子類。


免責聲明!

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



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