2016-01-14 136 views
1

我試圖做一個構造函數,它需要2個類型爲Punto的元素並將其指定給實例變量,在我的超類中我已經有了一個構造函數,但是我希望在我的子類中再多一個在我的子類我調用父類的構造函數,然後我嘗試添加一個多與以下錯誤:重載子類的構造函數

constructor in class cannot be applied to given types.

超類:

public class Poligono implements Figura { 

Punto[] vertici; 

public Poligono(Punto[] vertici) throws IndexOutOfBoundsException { 
    if(vertici == null || vertici.length<3) { 
     throw new IndexOutOfBoundsException(); 
    } 
    this.vertici = vertici; 
} 

子類:

package figura; 

import punto.Punto; 


public class Rettangolo extends Poligono{ 

    Punto p1; 
    Punto p2; 

    public Rettangolo(Punto[] vertici) throws IndexOutOfBoundsException { 
     super(vertici); 
    } 

    public Rettangolo(Punto p1, Punto p2) throws NullPointerException{ 

     if(p1==null || p2==null) throw new NullPointerException(); 

     this.p1 = p1; 
     this.p2 = p2; 
    } 

在我的第二個構造我的錯誤:

constructor Poligono in class Poligono cannot be applied to given types; 
required: Punto[] 
found: no arguments 
reason: actual and formal argument lists differ in length 
+0

注意,你幾乎肯定要採取的一個副本'vertici'在構造函數:所謂的*防禦副本*可防止後續更改你的'Poligono'類的'vertici'陣列。 –

回答

4

public Rettangolo(Punto p1, Punto p2)必須調用父類Poligono的一些構造函數。編譯器會抱怨,唯一可用的構造函數 - Poligono(Punto[] vertici) - 不適合第二個構造函數的參數。

你必須明確地調用Poligono構造與super(..)通話。

假設傳遞給構造函數的兩個點是一個矩形的兩個對角,並且Poligono構造預計頂點數組,你需要的東西是這樣的:

public Rettangolo(Punto p1, Punto p2) { 

    super (new Punto[]{p1, 
         new Punto (p1.getX(),p2.getY()), 
         p2, 
         new Punto (p2.getX(),p1.getY())}); 

    this.p1 = p1; 
    this.p2 = p2; 
} 

我可能得到的點或方法名稱的順序錯誤。

0

Why does this() and super() have to be the first statement in a constructor?

你可以做什麼(除了調用super())是

public Rettangolo(Punto p1, Punto p2) { 
    super(new Punto[] {p1, p2}); 
} 

我喜歡這個解決方案,因爲如果你使用Rettangolo(Punto[])你沒有任何點的工作。因此,無論你讀點出你的第一個構造函數,例如,

public Rettangolo(Punto[] vertici) throws IndexOutOfBoundsException { 
    super(vertici); 
    p1 = vertici[0]; 
    p2 = vertici[1]; 
} 

,或者你不單點工作,只使用數組來代替。

0

沒有父類的構造,如果你初始化「Rettangolo」對象,將被調用。

當一個對象被創建父類的狀態子類之前被初始化。

構造的第一行是父構造無論呼叫或撥打同一類的另一個構造,這將調用父構造函數。

現在你的情況:

public Rettangolo(Punto p1, Punto p2) throws NullPointerException{ 

    if(p1==null || p2==null) throw new NullPointerException(); 

    this.p1 = p1; 
    this.p2 = p2; 

}

您的構造函數試圖調用默認的構造函數,但由於沒有定義這樣的構造,發生錯誤。

要麼你定義一個默認構造函數的父類和初始化Punto的P1,P2,但隨後vertici []數組將是空的。

或者你也可以做

public Rettangolo(Punto p1, Punto p2) throws NullPointerException{ 
    super(new Punto[] {p1,p2}); 
    if(p1==null || p2==null) throw new NullPointerException(); 

    this.p1 = p1; 
    this.p2 = p2; 
} 

但那就要看你的需求。你只需要記住總是首先調用父類的構造函數。