2014-09-05 98 views
2

我是Java新手。在下面的代碼中,我很難理解這些概念。超級類Sub構造函數java

class A { 

    private Integer intr; 

    public A(Integer intr) { 
     this.inrt = intr; 
    } 

    public Integer getIntr() { 
     return intr; 
    } 
} 

class B extends A { 

    public B(Integer intr) { //Eclipse asking me to create this constructor. 
     super(intr); 
    } 
} 

我越來越困惑,爲什麼我需要創建那種構造爲月食暗示。那裏有什麼?

回答

2

來實例化一個A是使用A(Integer)構造函數的唯一方法。除非超類實現了空構造函數,否則每個子類都必須在其自身構造函數的開頭明確地調用超構造函數。

但是,子類構造函數不一定需要完全相同的簽名。例如,這些也是有效的:

public B() { 
    super(42); 
    // other B specific stuff 
} 

public B(Integer i, String s) { 
    super(i); 
    // other B specific stuff 
} 
+0

謝謝。我得到了我正在尋找的答案。 – 2014-09-05 14:31:46

2

如果沒有構造函數,就有默認的構造函數,它也調用超級的默認構造函數。但是當你在父類中創建構造函數時,父類中沒有默認的構造函數。

4

子類的構造函數調用其超類的構造函數(在您的案例中爲A)。如果您的子類B沒有構造函數,編譯器會自動創建一個沒有任何參數的構造函數。該構造函數自動調用不帶基類A參數的構造函數。

因爲你的基類A有一個參數的構造函數,編譯器不產生不爲其參數的構造函數,因此,你必須明確地在你的子類B.創建一個單一的參數匹配的構造

的其他選擇開創B中的構造函數:

您可以在定義一個無參數的構造函數:

public A() 
{ 
    this.inrt = 0; 
} 

這將允許無參數構造函數爲B自動生成以調用A中的匹配構造函數。

或者你可以明確地定義B一個無參數的構造函數調用的A現有的構造函數:

public B() 
{ 
    super(0); 
} 
+1

'由於你的基類一個類有一個帶參數的構造函數,編譯器確實生成了一個沒有參數的構造函數',你的意思是不對吧? – Betlista 2014-09-05 14:27:56

+1

@Betlista感謝您接收我的錯字。固定。 – Eran 2014-09-05 14:30:03