簡體   English   中英

重載子類的構造函數

[英]Overload the constructor of a subclass

我正在嘗試制作一個構造函數,該構造函數接受2個Punto類型的元素並將其分配給實例變量,在我的超類中我已經有一個構造函數,但是我想在我的子類中再添加一個,因此在我的子類中首先調用超類構造函數,然后然后我嘗試再添加一個以下錯誤:

類中的構造方法不能應用於給定的類型。

超類:

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

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

您必須使用super(..)調用顯式調用Poligono構造函數。

假設傳遞給該構造函數的兩個點是矩形的兩個相對角,並且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;
}

我可能弄錯了點的順序或方法名稱錯誤。

為什么this()和super()必須是構造函數中的第一條語句?

您可以做的(除了調用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];
}

否則您將無法使用單點,而只能使用數組。

如果初始化“ 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 []數組將為null。

或者你可以做

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;
}

但這取決於您的要求。 您只需要記住父類構造函數將始終被首先調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM