2014-06-17 128 views
-3

有人可以解釋爲什麼你不需要重寫Super類中定義的所有構造函數。例如:在Java中的繼承和重寫父類的構造函數

Public Employee{ 
    String naam; 
    String adres; 

    Employee(String name) { 
     this.name = name; 
    } 

    Employee(String naam, String adres) { 
     this(name); 
     this.adres =adres; 
    } 
} 

public Person extends Employee { 
    String name; 
    String adres; 

    Person(String name) { 
     this.name=name; 
    } 
} 

如果我不重寫第一個構造函數,我得到一個編譯器錯誤。

+0

您的構造函數需要一個參數:'name'。在Java中,只有非參數構造函數是由defaut生成的。 – Mik378

+0

如何重寫構造函數????? – anirban

回答

0

基本上,因爲當一個子類被初始化時,它總是也需要初始化它的超類,即調用超類的構造函數。

如果您沒有通過super(...)調用顯式地調用超類的構造函數(如您的示例中所示),它將嘗試隱式調用默認構造函數super()(即不帶參數)。

現在在你的超類中你定義了一些需要參數的自定義構造函數,這意味着沒有更多的默認構造函數,因此這種情況會引發編譯時錯誤,因爲你試圖(隱式地)調用(默認)構造函數,它不在超類中。

這是你的問題:這個問題不是關於構造函數的重寫(這是一個概念在概念上是錯誤的)。

2

默認情況下,編譯器會爲每個類生成非參數構造函數,只要沒有手動指定的相鄰構造函數

默認情況下,如果你不Person類指定任何構造函數,編譯器會產生這樣一條:

public Person extends Employee{ 
    String name; 
    String adres; 
    Person(){ 
    super(); //there is no constructor with no-arg in your parent class, therefore compilation obviously fails ! 
    } 

請注意,您Employee類「禁用」默認代無參構造函數因爲它提供了至少一個構造函數,參數爲,而NO構造函數不帶參數,說明前面生成的代碼不能編譯。

因此,您需要一種方法將參數name傳遞給Employee類。 要做到這一點的唯一方法是精確的「自定義」構造函數,意味着手動硬編碼,將調度參數到父項的構造函數。

這就是爲什麼這是正確的解決方案(不是你的):

public Person extends Employee{ 
    Person(String name){ 
    super(name); 
    } 

注意,使Person延伸出的Employee是沒有意義的,它會更合乎邏輯的有Employee延伸Person

0

將此添加到Employee類定義:CUSTOM(){}。或者,您可以嘗試使用完整的代碼給出更明確的示例,最終可能會產生您正在獲取的錯誤。你對naam和name進行了幾次引用,並在Employee類def中進行了交換,這真是令人困惑。

0

why you dont need to override all constructors that defined in Super class

你不是重寫構造函數,你描述的不是重寫。如果不指定默認構造函數,編譯器將創建一個默認構造函數,如果它是子類,它將在默認構造函數中調用默認的父構造函數super()。

你得到編譯器錯誤,因爲超類沒有默認構造函數如果添加一個默認的父類的構造

Public Employee{ 
Employee(){} 
. 
. 

} 

,你不會得到錯誤

在你的情況,你重寫被定義

通過定義默認構造函數

Person(String name){ 
this.name=name; 
} 

在這裏閱讀更多http://www.javaworld.com/article/2076204/core-java/understanding-constructors.html