Зачем использовать супервызов в суперклассе, если он не имеет явно определенного суперкласса

package Geometry;

public abstract class GeometryFigures{

protected double surfaces;
protected double perimeter;

public GeometryFigures(double surfaces, double perimeter) {

    super(); //**<---Why use super call here?**

    this.surfaces= surfaces;
    this.perimeter= perimeter;
}

public double getSurfaces() {
    return surfaces;
}

public double getPerimetre() {
    return perimeter;
}


}

Так что в принципе все в названии. Я хочу знать, почему мне нужно использовать super() в суперклассе.

Спасибо за помощь.


person marcAndreG    schedule 25.01.2016    source источник
comment
comment
на самом деле это не тот же вопрос. На самом деле я знаю, когда мне нужно использовать супервызов, но я не был уверен, почему этот код вызывает суперконструктор, если он находится в суперклассе.   -  person marcAndreG    schedule 26.01.2016
comment
Вы имеете в виду: когда у него нет явно определенного суперкласса? Если да, то ваш вопрос не так ясен.   -  person user3707125    schedule 26.01.2016
comment
Да это я имел в виду. Спасибо   -  person marcAndreG    schedule 26.01.2016


Ответы (5)


Если конструктор явно не вызывает конструктор суперкласса, компилятор Java автоматически вставляет вызов конструктора суперкласса без аргументов. Если суперкласс не имеет конструктора без аргументов, вы получите ошибку времени компиляции. У Object есть такой конструктор, поэтому, если Object является единственным суперклассом, проблем нет.

согласно docs.oracle

person Abdelhak    schedule 25.01.2016

В этом случае super() относится к конструктору объекта, который является суперклассом каждого класса.

На самом деле вам не нужно его вызывать, поскольку по умолчанию конструктор всегда пытается вызвать super(), если не вызывается никакой другой конструктор суперкласса.

Я видел, как некоторые генераторы кода добавляют его автоматически, я предполагаю, что это считается лучшей практикой в ​​качестве явного напоминания о том, что super() будет вызываться.

person ecarlos    schedule 25.01.2016

Вам не нужно, потому что он будет добавлен компилятором неявно.

Я думаю, что IDE добавляют его автоматически, потому что они генерируют код на основе шаблонов. Это может быть полезно, если конструктору super требуются некоторые аргументы, которые можно извлечь локально.

person Sleiman Jneidi    schedule 25.01.2016

Представьте, что у вас есть этот класс:

public class A {
   public A() {
       // N lines of code
   }
}

И тогда у вас есть два дочерних класса:

public class B extends A {
   public B() {
       // N lines of code
       // M lines of specific code for class B
   }
}

public class C extends A {
   public C() {
       // N lines of code
       // P lines of specific code for class C
   }
}

Как вы можете заметить, поскольку классы B и C наследуются от A, вы также должны наследовать код конструктора. Итак, если бы вы не могли использовать super(), вам пришлось бы копировать и вставлять весь код в каждый дочерний класс. И так далее...

Это также подразумевает определенный уровень абстракции при расширении некоторого класса, поскольку суперкласс может иметь определенный код в своем конструкторе, например инициализации.

person Christian    schedule 25.01.2016

В вашем примере нет причин использовать super(). Java автоматически сделает этот вызов за вас, даже если вы не напишете его явно.

Итак, когда вам нужно позвонить super()? Вот пример использования подкласса вашего класса GeometryFigures.

public class MyFigure extends GeometryFigures {

    public MyFigure() {
        super( 5.0, 42.0 );
    }

    // ...
}

Здесь вам нужен вызов super(), потому что в вашем классе нет конструктора по умолчанию (без аргументов). Java не будет предоставлять вызов super() с аргументами (как это возможно? Какие параметры он будет использовать?). Поэтому в этом случае вы должны предоставить вызов и указать, какой конструктор и какие параметры использовать.

person markspace    schedule 25.01.2016