Почему 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
Ничего плохого в этом нет, просто предпочтение стиля кодирования. Некоторым людям нравится писать код, который неявный, а некоторые нет.
Если вы не вызываете супер-конструктор из вашего конструктора-конструктора дочернего класса, то для вас вызывается вызов супер-конструктора по умолчанию в байтовом коде.
См. также этот вопрос