2013-10-28 56 views
0

我收到以下代碼中標題中提到的錯誤。請告訴我爲什麼我得到這個錯誤,雖然我沒有從超類的任何地方調用默認構造函數MyNumber(),以及如何解決它。隱式超類構造函數MyNumber()未定義。必須調用另一個構造函數

package referencereturntype; 

公共類mynumber的{ 字符串NUM;

public MyNumber(String str){ 
    num=str; 
} 

public static void main (String [] args){ 
    MyNumber my_num= new MyNumber("+2"); 
    System.out.println("Success! The object of the class itself is successfully returned from retOb(). The object now contains the string : " + retOb(my_num).num); 
} 

public static SubMyNumber retOb(MyNumber my_num){ 
    SubMyNumber sub_my_num= new SubMyNumber("-50"); 
    sub_my_num.nums=my_num.num; 
    return sub_my_num; 
} 

}

公共類SubMyNumber延伸mynumber的{ 字符串NUMS;

public SubMyNumber(String strs){ 
    nums=strs; 
} 

}

在此先感謝。

回答

1

由於您沒有默認構造函數,因此必須將其明確稱爲它。

public class SubMyNumber extends MyNumber { 
    String nums; 
    public SubMyNumber(String strs){ 
     super(null); // Or the value you want to superClass 
     this.nums=strs; 
    } 
+0

但是爲什麼?爲什麼必須使用超類的構造函數? – user2882662

+0

@ user2882662因爲你在說'SubMyNumber'是一個'MyNumber',構造'MyNumber'實例的唯一方法是使用帶有一個參數的構造函數。 – nachokk

+0

所有類都需要調用超類的構造函數。這是爲了允許超類實例化其所有成員。假設你有一個名爲'Animal'的類,它有一個叫getName()的方法和一個相應的'name'變量。你繼承「Animal」並創建一個Cat類。當你有一個'Cat'類的實例時,你可以調用'getName()'。但是如果你沒有調用超級構造函數,那麼'name'變量就不會被設置。 – Chill

1

實例化派生類時必須從基類調用構造函數。
如果你不這樣做,Java將默認調用默認的構造函數。

如果沒有默認構造函數,則會出現該錯誤。

0

當超類沒有默認的空構造函數時,則必須從子類的構造函數明確調用super

1

JLS 8.8.7

如果構造體不明確的構造函數調用,並正在申報的構造開始不是原始類對象的一部分,然後在構造函數體隱式超類構造函數調用開始「超級();」,

由於在超類中沒有無參構造函數與String參數的構造必須顯式調用

+0

+1對於jls文章 – nachokk

0

問題是,如果在你的類中沒有定義構造函數,那麼java在內部提供了一個默認的構造函數,它被進一步用於創建對象。如果你提供你自己的構造函數(可以是默認的或參數化的),Java提供的隱藏構造函數會丟失。 在你的情況下,你已經在'MyNumber'中提供了一個參數化的構造函數。因此隱藏的默認構造函數不能從子類的構造函數(super())調用。

您需要在此代碼中做的唯一更改是 1.除已經存在的參數化構造函數之外,還給出您自己的默認構造函數。現在,當'MyNumber'類的默認構造函數應該從'SubMyNumber'的參數化構造函數中的第一個LOC被INTERNALLY調用時,不會有任何錯誤。

  • 也可以更改指SUBn類的參數的構造這樣

    公共SubMyNumber(字符串的STR){ 超級序列(STR); nums = strs; }

  • 這種方式,你必須明確地設置爲mynumber的參數的構造函數被調用它已被定義。

    相關問題