Короткий ответ
Компилятор автоматически добавит так называемый конструктор по умолчанию — конструктор без параметров, тело которого состоит из вызова конструктора родителя super(). Благодаря этому объект класса по-прежнему можно создать оператором new, а цепочка конструкторов корректно строится от базового класса к производному.
Как это работает подробнее
Конструктор по умолчанию добавляется только в одном случае: если в классе нет вообще ни одного конструктора. Если программист объявил хотя бы один конструктор, например Book(String title), автоматический конструктор не создаётся, и для new Book() понадобится явный конструктор без параметров. Видимость сгенерированного конструктора совпадает с видимостью класса.
- Условие генерации — в классе не объявлено ни одного конструктора; иначе компилятор не добавляет ничего.
- Вызов super() — у родителя должен быть доступный конструктор без параметров; иначе наследник обязан явно вызвать подходящий super(...).
- Роль — корректно проинициализировать объект и построить цепочку вызовов конструкторов от базового класса к производному.
Пример кода
Book.java
public class Book {
// конструктор не объявлен — компилятор добавит Book() { super(); }
public static void main(String[] args) {
Book b = new Book(); // работает: есть конструктор по умолчанию
}
}Что использовать на практике
- Не пиши пустой конструктор явно, если он не нужен: при отсутствии конструкторов компилятор создаст его сам.
- Объявив параметризованный конструктор, сразу реши, нужен ли вызов new ClassName() без аргументов, и добавь пустой конструктор вручную.
- Если у суперкласса нет конструктора без параметров, вызови super(...) первой строкой своего конструктора.