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.只要父...