Почему eclipse автоматически добавляет метод java super() в конструкторе, когда я использую генератор кода редактора?

Когда я пишу конструктор в своем классе java, я обычно не вызываю super(). Когда я сгенерирую конструктор из редактора исходного кода eclipse, почему он всегда добавляет супер()?

Я ошибаюсь, если не добавить это по умолчанию в конструкторах, которые я пишу? Что-то не так, если оставить вызов super() в конструкторе, если я решил использовать генератор кода eclipse?

Ответ 1

Как упоминал @Kon в своем комментарии, пустой конструктор в Java содержит неявный вызов конструктора суперкласса.

Кроме того, непустой конструктор без явного вызова super() будет иметь неявный вызов вверху.

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

Подробнее см. этот вопрос.

Обновить. Рассмотрим следующий код, который иллюстрирует сценарий, где неправильно оставить super(), сгенерированный eclipse.

public class Foo{
    public Foo(int a, int b) {
        System.out.println("Foo constructor with-args is called");
    }
    public Foo() {
        System.out.println("Foo with no-args is called");
    }
}
class Bar extends Foo {
    public Bar() {
        // Implicit call to super()
        super(); 

        // Explicit call to super(a,b);
        // This will not compile unless the call above has been removed.
        super(1,2);
    }
}

Ответ 2

Как правильно указывает @Kon, в любом случае существует конструктивный конструктор по умолчанию (это легко проверить, проверив байт-код с помощью javap -c). Если вы не хотите, чтобы Eclipse делал это явным, просто установите флажок "Опустить вызов в стандартный конструктор super()" в нижней части графического интерфейса создания конструктора.

enter image description here


Я ошибаюсь, если не добавить это по умолчанию в конструкторах, которые пишу?

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

Что-то не так, если оставить вызов super() в конструкторе, если я решил использовать генератор кода eclipse?

Нет, совсем нет.

Ответ 3

Ничего плохого в этом нет, просто предпочтение стиля кодирования. Некоторым людям нравится писать код, который неявный, а некоторые нет.

Если вы не вызываете супер-конструктор из вашего конструктора-конструктора дочернего класса, то для вас вызывается вызов супер-конструктора по умолчанию в байтовом коде. См. также этот вопрос