1. 程式人生 > >java語言基礎(33)——面向物件(父類中沒有無參構造編譯報錯——無法將類 xxx中的構造器 xxx應用到給定型別 實際引數列表和形式引數列表長度不同)

java語言基礎(33)——面向物件(父類中沒有無參構造編譯報錯——無法將類 xxx中的構造器 xxx應用到給定型別 實際引數列表和形式引數列表長度不同)

注意:以下程式碼是錯的。

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("名字隨意"); // 引數值就無所謂了,只要型別,個數對應就行。