java語言基礎(33)——面向物件(父類中沒有無參構造編譯報錯——無法將類 xxx中的構造器 xxx應用到給定型別 實際引數列表和形式引數列表長度不同)
阿新 • • 發佈:2019-01-11
注意:以下程式碼是錯的。
原因分析:class Father { public Father(String name){ System.out.println("Father帶參構造"); } } class Son extends Father { public Son(){ System.out.println("Son無參構造"); } public Son(String name){ System.out.println("Son帶參構造"); } } class ExtendsDemo { public static void main(String[] args){ Son s = new Son(); System.out.println("----------"); Son s1 = new Son("小明"); } }
1 當類沒有給出構造方法時,java會預設給出無參構造。而Father給出了帶參構造
public Father(String name){ }
系統就不會再給無參構造。
2 子類的構造方法其實第一句都預設是super(); 是呼叫父類的無參構造。而此時父類沒有無參構造,只有帶參構造,所以報錯原因為:實際引數列表和形式引數列表長度不同,可不是嘛,父類只有帶參構造,而你呼叫無參構造。
解決方案:
1 給父類定義一個無參構造。
2 顯式的呼叫父類其它構造方法。必須放在子類構造方法中的第一句。
其實,並不是一定要呼叫父類的無參構造的。呼叫父類的其它構造也是可以的。因為繼承父類要對父類進行初始化,我們沒有手動初始化父類,java為了避免在用到父類中資料時,父類物件還不存在,所以就在子類構造中隱式地調父類無參構造來對父類初始化。也就是我們說的,子類構造方法中第一句預設都為:super();
當父類沒有無參構造方法時,我們就可以顯式地呼叫父類的其它構造方法。上例中我們可以在子類構造的第一句寫
super("名字隨意"); // 引數值就無所謂了,只要型別,個數對應就行。