一、過程
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的子類。