1. 程式人生 > >子父類構造函數特點

子父類構造函數特點

註意 style 進行 gpo 子類 super() 自己 his cal

在子類構造對象時,發現訪問子類構造函數時,父類也運行了。

為什麽呢?

因為:在子類的構造函數中,第一行有一個默認的隱式語句 -----> super();

                             //調用的是父類中空參數的構造函數

   而子類的構造函數(無論有 還是無參),第一行的默認隱式語句都是super();

為什麽子類實例化的時候要訪問父類中的構造函數呢?

  子類繼承父類,獲取到了父類中的內容(屬性),所以在使用父類內容之前,要先看父類是如何對自己的內容進行初始化的,所以子類在構造對象時,必須訪問父類中的構造函數。

為了完成這個必須的動作,就在子類的構造函數中加入了

super()語句。

如果父類中沒有定義空參數構造函數,那麽子類的構造函數必須用super明確要調用父類中的哪個構造函數。同時子類的構造函數中,如果使用this調用本類構造函數時,super就沒有了。因為superthis都只能定義第一行。所以只能有一個。但是可以保證的是,子類中肯定會有其他的構造函數訪問父類的構造函數。

這裏需要註意的是:super語句必須定義在子類構造函數的第一行。因為父類的初始化動作要先完成。

子類對象初始化必須訪問至少一個父類。

註意--->沒有父類的情況下:先默認初始化,再構造函數初始化,然後再顯示初始化,

但是有父類的情況下:通過super初始化父類內容時,子類的成員變量並未

顯示初始化,而是默認初始化0。等super()父類初始化完畢後,才進行子類的成員變量顯示初始化8

一個對象實例化過程:

Person p = new Person();

  1. jvm會讀取指定的路徑下的Person.class文件,並加載進內存,並會先加載person的父類(如果有直接的父類的情況下)。
  2. 在堆內存中的開辟空間,分配地址。
  3. 並在對象空間中,對對象中的屬性進行默認初始化。
  4. 調用對應的構造函數進行初始化。
  5. 在構造函數中,第一行會先調用父類中構造函數進行初始化。
  6. 父類初始化完畢後,在對子類的屬性進行顯示初始化。
  7. 在進行子類構造函數的特定初始化。
  8. 初始化完畢後,將地址值賦給引用變量。

Ps:引用變量不一定在棧內

Class demo{

Person p = new Person();//在堆內,成員變量。

}

子父類構造函數特點