java繼承中子類別是不會繼承父類別的建構子的,只是必須呼叫# (隱式或顯式)
下面來看範例:
public class TestExtends { public static void main(String[] args) { SonClass s = new SonClass(66); } } class FooClass{ public FooClass() { System.out.println(100); } public FooClass(int count) { System.out.println(count); } } class SonClass extends FooClass{ public SonClass() { } public SonClass(int c) { System.out.println(1234); } }
運行結果:
#100
1234
#接下來分析為什麼會產生這樣的結果:
程式在執行SonClass s = new SonClass(66);
這行時,呼叫
public SonClass(int c) { System.out.println(1234); //在执行这行时系统会优先调用父类的无参构造函数super(); }
因此子類在執行上面的建構方法時,等價於執行了下面的程式碼:
public SonClass(int c) { super(); // 必须在第一行调用,否则不能编译 System.out.println(1234); //在执行这行时系统会优先调用父类的无参构造函数super(); }
所以結果為:100 1234
接下來介紹另外一種情況(明確呼叫),如果子類別建構函式是這樣寫的:
public SonClass(int c) { super(2); // 必须写在第一行,否则不能编译,显式调用父类构造函数后,系统就不在默认调用无参构造函数了 System.out.println(1234); }
執行結構是:2 1234
建構子是不能繼承的,只是用來在子類別呼叫,(如果父類別沒有無參建構函數,建立子類別時,必須在子類別建構函數程式碼體的第一行明確呼叫父類別的有參數建構函數,否則不能編譯);
如果父類別沒有有參構造函數,那麼在建立子類別時可以不明確地呼叫父類別建構子,系統會預設呼叫父類別的無參考建構子
super()
;如果父類沒有無參構造函數,那系統就調不了預設的無參構造函數了,所以不顯示呼叫編譯也就無法通過了;
補充說明:
在java中,建立有參建構子後,系統就不在有預設的無參構造子
如果父類別中沒有任何建構子,系統會預設有一個無參的建構子
以上是java的繼承,子類別是否繼承父類別的建構函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!