子父類構造函數特點
阿新 • • 發佈:2017-12-23
註意 style 進行 gpo 子類 super() 自己 his cal super()語句。
在子類構造對象時,發現訪問子類構造函數時,父類也運行了。
為什麽呢?
因為:在子類的構造函數中,第一行有一個默認的隱式語句 -----> super();
//調用的是父類中空參數的構造函數
而子類的構造函數(無論有 還是無參),第一行的默認隱式語句都是super();
為什麽子類實例化的時候要訪問父類中的構造函數呢?
子類繼承父類,獲取到了父類中的內容(屬性),所以在使用父類內容之前,要先看父類是如何對自己的內容進行初始化的,所以子類在構造對象時,必須訪問父類中的構造函數。
為了完成這個必須的動作,就在子類的構造函數中加入了
如果父類中沒有定義空參數構造函數,那麽子類的構造函數必須用super明確要調用父類中的哪個構造函數。同時子類的構造函數中,如果使用this調用本類構造函數時,super就沒有了。因為super和this都只能定義第一行。所以只能有一個。但是可以保證的是,子類中肯定會有其他的構造函數訪問父類的構造函數。
這裏需要註意的是:super語句必須定義在子類構造函數的第一行。因為父類的初始化動作要先完成。
子類對象初始化必須訪問至少一個父類。
註意--->沒有父類的情況下:先默認初始化,再構造函數初始化,然後再顯示初始化,
但是有父類的情況下:通過super初始化父類內容時,子類的成員變量並未 顯示初始化,而是默認初始化0。等super()父類初始化完畢後,才進行子類的成員變量顯示初始化8。
一個對象實例化過程:
Person p = new Person();
- jvm會讀取指定的路徑下的Person.class文件,並加載進內存,並會先加載person的父類(如果有直接的父類的情況下)。
- 在堆內存中的開辟空間,分配地址。
- 並在對象空間中,對對象中的屬性進行默認初始化。
- 調用對應的構造函數進行初始化。
- 在構造函數中,第一行會先調用父類中構造函數進行初始化。
- 父類初始化完畢後,在對子類的屬性進行顯示初始化。
- 在進行子類構造函數的特定初始化。
- 初始化完畢後,將地址值賦給引用變量。
Ps:引用變量不一定在棧內
Class demo{
Person p = new Person();//在堆內,成員變量。
}
子父類構造函數特點