2016-01-14 3 views
1

Я пытаюсь сделать конструктор, который принимает 2 элемента типа Punto и присваивает его переменным экземпляра, в моем суперклассе У меня уже есть конструктор, но я хочу еще один в своем подклассе, так что сначала в моем подклассу я называю конструктор суперкласса, а затем я пытаюсь добавить еще один со следующей ошибкой:Перегрузка конструктора подкласса

constructor in class cannot be applied to given types.

Superclass:

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) - не соответствует параметрам второго конструктора 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; 
} 

я, возможно, получили порядок точек или неправильных имен методов.

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

Но это зависит от ваших требований. Вам просто нужно помнить, что конструктор родительского класса всегда будет вызываться первым.

Смежные вопросы