2015-12-19 37 views
1

在這個程序就沒有必要了super到達父類的構造函數:創建子類時是否需要超級?

class Base{ 

    Base(){ 

     System.out.println("Base"); 
    } 
} 

public class test2 extends Base{ 

    test2() { 

     //super(); 
     System.out.print("test2"); 
    } 

    public static void main(String argv[]){ 

     test2 c = new test2(); 
    }  
} 

但這個方案在quest1構造函數需要super並給出了一個錯誤說

構造quest不能適用於給定類型:必填int,找不到參數

class Quest { 

    Quest(int y){ 

     System.out.print("A:"+y); 
    } 
} 

class Quest1 extends Quest { 

    Quest1(int x){ 

     //super(x+1); 
     System.out.print("B:"+x); 
    } 
} 

class Test { 

    public static void main(String argv[]){ 

     Quest1 q = new Quest1(5); 
    } 
} 
+0

你的問題是回答? – user1803551

+0

@ user1803551我明白當我需要超級但是當我們需要超級時,答案令人困惑。所以我沒有選擇一個。 – madkobra

+0

夠公平的,但你應該要求回答者澄清,這就是評論的意思,他們的工作是解釋答案並對其進行補充。 – user1803551

回答

1

JLS 8.8.7定義與mathching參數的構造。構造函數體

如果構造體不明確的構造函數調用,並正在申報的構造開始不是原始類Object的一部分,那麼在構造函數體含蓄與超類構造函數調用「​​」開始,一調用它的直接超類的構造函數,它不帶任何參數。

class Base { 

    Base() { 

    } 
} 

public class test2 extends Base { 

    test2() { 

     //super(); 
     System.out.print("test2"); 
    } 
} 

的註釋行被自動添加和自超類的無參數的構造被定義,不存在誤差。

class Quest { 

    Quest(int y) { 

     System.out.print("A:"+y); 
    } 
} 

class Quest1 extends Quest { 

    Quest1(int x) { 

     //super(x+1); 
     System.out.print("B:"+x); 
    } 
} 

隱式呼叫super()的情況下,試圖調用一個未定義的構造在超類中,這會導致錯誤

隱超級構造任務()是未定義的。必須顯式調用另一個構造函數。

取消註釋顯式構造函數調用將取代隱式調用,從而解決問題。或者,在超類中定義一個無參數構造函數。

1

當且僅當您的父母class沒有默認構造函數(接受無參數)時,您需要致電super()

在所有其他情況下(其中存在一個具有零參數的構造函數),您不必編寫代碼。無論如何它都被隱式地稱爲。

本規則適用於:

  • 如果你的父類具有在所有沒有構造,它具有默認的構造函數,它沒有參數 - >不需要super();
  • 你的父類聲明無參數的構造函數 - >不需要super()
  • 類與參數的構造函數,但沒有構造不帶參數 - >您需要調用的一個經由super()
-1

如果您在超類中創建構造函數,則應該在子類構造函數調用之前調用超類構造函數(例如:super())。

+0

在調用子類構造函數之前,不能調用超級構造函數。它必須是你在子類構造函數中做的第一件事。 – user1803551

+0

是的,我也是電話相同。請理解我的答案。你懂的:super(); SubClass obj = new SubClass();每個人都知道這是「傷疤」。我的答案是:SubClass {super(); SubClass(){}} – Doss

+0

爲什麼你不在回答中寫清楚?正如現在所寫,這是錯誤的。 – user1803551

相關問題