重载子类的构造函数

时间:2016-01-14 12:51:55

标签: java inheritance constructor

我正在尝试创建一个构造函数,它接受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

3 个答案:

答案 0 :(得分:4)

你的public Rettangolo(Punto p1, Punto p2)必须调用超类Poligono的一些构造函数。编译器抱怨唯一可用的构造函数 - Poligono(Punto[] vertici) - 不适合第二个Rettangolo构造函数的参数。

您必须使用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;
}

我可能已经得到了点或方法名称的顺序错误。

答案 1 :(得分:0)

jsfiddle

您可以做的事情(除了致电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];
}

或者您不使用单点,而只使用数组。

答案 2 :(得分:0)

如果你初始化&#39; Rettangolo&#39;将不会调用超类构造函数。宾语。

每当创建一个对象时,父类状态在子类之前被初始化。

构造函数的第一行是调用父构造函数或调用同一个类的另一个构造函数,它将调用父构造函数。

现在你的情况:

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

但这取决于您的要求。您只需要记住,将始终首先调用父类构造函数。