Java 父類建構函式中呼叫子類重寫的方法

2021-08-19 15:10:56 字數 690 閱讀 6923

public class c1 

public string s="aaaa";

//父類建構函式

public c1()

public void call()

}class c2 extends c1

//重寫父類中的call函式

public void call()

}

輸出:

null

bbbb

aaaa

分析:

1.初始化c2()時,先初始化c2的父類:c1()

初始化c1()的靜態變數和靜態**塊

初始化c2()的靜態變數和靜態**塊

2.初始化c1()的非靜態變數,初始化父類的建構函式。

如果父類的建構函式中呼叫的方法被子類重寫,那麼呼叫的會是子類的方法。

3.初始化c2()的非靜態變數,初始化子類的建構函式。

由於父類第一次呼叫子類的call方法時,子類還沒有初始化非靜態變數以及構造方法,因此輸出是null。

通過父類的引用型別變數指向子類型別物件,訪問成員變數時是訪問的父類的成員變數。

(另外做個記錄:類載入時會為靜態變數賦初值,執行靜態**塊,但不會執行類的靜態方法,類的方法在呼叫時才會執行)

參考:

java中父類建構函式中呼叫子類重寫的方法

第乙個例子 class a 該建構函式自始至終就沒有被呼叫過 public void print class b extends a 重寫父類中的print 函式 public void print public class main 輸出 null asdg 總結 1.初始化c2 時,先初始化c2...

子類與父類構造函式呼叫順序

子類的析構函式的呼叫順序,和子類的建構函式的呼叫順序相反!記住,相反即可。include include using namespace std classm m classn n classa a classb public a b private m m1 m m2 static n ms n ...

父類建構函式 子類建構函式

1.子類可以通過super關鍵字來顯式地呼叫父類的建構函式。2.當父類沒有提供無引數的建構函式時,子類也不可以有無參建構函式,且子類的建構函式中必須顯式的呼叫父類的建構函式 3.如果父類提供了無引數的建構函式,此時子類的建構函式就可以不顯式的呼叫父類的建構函式,預設呼叫父類的無參建構函式。4.只要父...