繼承關係下new子類物件,會發生什麼?

2021-07-16 06:56:32 字數 1880 閱讀 8332

假定class student extends person

那麼student s = new student();這條語句new子類student物件,到底發生了什麼?

■由於要用到student類,系統會看一下「類頭「,一看不得了,原來sthdent還有個父類person

■父類person 類載入

* 在這一過程中父類靜態變數初始化器與父類靜態**塊將分別執行

■子類student 類載入

* 在這一過程中子類靜態變數初始化器與子類靜態**塊將分別執行

■在棧中建立子類student物件引用,並預設初始化

■在堆中為父類person建立物件

■在父類person建立的物件的基礎上為子類student建立物件[相當於父類物件內嵌到子類物件中]

■父類子類初始化(先父類後子類)

根據new建立命令的有參或無參進行子類的有參或無參構造方法的呼叫準備階段

子類構造呼叫準備階段①檢視子類構造方法的方法頭:

發現系統自動新增的super();,所以就跳轉去進行父類空參構造的呼叫準備階段【如果自己新增置頂了「帶引數super「則跳轉去進行父類有參構造的呼叫準備階段】【如果自己新增置頂了this,則可跳轉去進行本類其他構造方法的呼叫準備階段

父類構造呼叫準備階段①檢視父類構造方法的方法頭:

如果既沒通過supe發現父類的長輩,也沒通過this發現父類其他構造方法,那就不再跳轉

父類構造呼叫準備階段②檢測是否有父類成員的定義時顯示初始化**:

有則先顯示初始化

父類構造呼叫準備階段③接著檢測構造**塊:

若有則先執行構造**塊)

父類構造呼叫階段

父類構造方法入棧,執行父類構造方法,執行完畢return返回,父類構造彈棧

→回頭繼續執行子類構造呼叫構造準備階段②檢測是否有子類成員的宣告時顯示初始化**:

有則先顯示初始化

子類構造呼叫準備階段③接著檢測構造**塊:

若有則先執行構造**塊

子類構造呼叫階段

子類構造方法入棧,執行子類構造方法,執行完畢return返回,子類構造彈棧

■將子類物件的位址值賦值給s

以下是初始化順序的證明案例

class test 

public test()

public static void main(string args)

}class person

public person(string str)

}class myclass extends test

public myclass()

}

輸出結果:

system.out.println(「test static」);

system.out.println(「myclass static」);

system.out.println(「person static」);

system.out.println(「person 「+」test」);

system.out.println(「test constructor」);

system.out.println(「person 「+myclass);

system.out.println(「myclass constructor」);

關於父類子類繼承關係

一.繼承 子類可以直接復用父類中的成員.子類繼承父類所有方法的宣告和實現 非私有的例項變數以及協議 繼承時要在.h中宣告一下 繼承具有單根性和傳遞性 繼承的根類 大多都繼承自 nsobject 類,所以在定義乙個類時,要繼承nsobject 類。繼承就是 優化公共部分交給父類 例如 person是父...

子類繼承父類,new 乙個子類物件的過程(待完善)

父類 public class jvmbase public static void basestaticmethod public jvmbase 子類 public class jvmsub extends jvmbase public static void substaticmethod p...

繼承關係中子類使用 Data註解問題

平時習慣使用lombok工具,免去了我們寫get set方法之類的,當然了,我們使用 data註解後,equals hashcode tostring 也省卻了。但是當你 存在繼承關係時,就得留心結果是否是你想要的了?下面我直接列舉個例子吧 父類 data noargsconstructor all...