Сначала немного терминологии:
- Конструктор без аргументов: Конструктор без параметров;
- Доступный конструктор без аргументов: конструктор без аргументов в суперклассе, видимый подклассу. Это означает, что он является либо общедоступным, либо защищенным, или, если оба класса находятся в одном пакете, доступ к пакету; и
- Конструктор по умолчанию: открытый конструктор без аргументов, добавленный компилятором, когда в классе нет явного конструктора.
Таким образом, у всех классов есть хотя бы один конструктор.
Конструкторы подклассов могут в качестве первого шага указать, какой конструктор в суперклассе вызывать перед выполнением кода в конструкторе подкласса.
Если конструктор подкласса не указывает, какой конструктор суперкласса вызывать, то компилятор автоматически вызовет доступный конструктор без аргументов в суперклассе.
Если у суперкласса нет конструктора без аргументов или он недоступен, то не указание вызываемого конструктора суперкласса (в конструкторе подкласса) является ошибкой компилятора, поэтому необходимо указать.
Например:
public class Base { }
public class Derived extends Base { }
Это хорошо, потому что, если вы не добавите конструктор явно, Java вставит вам открытый конструктор по умолчанию.
public class Base { }
public class Derived extends Base { public Derived(int i) { } }
Также хорошо.
public class Base { public Base(String s) { } }
public class Derived extends Base { }
Выше приведена ошибка компиляции, поскольку у Base нет конструктора по умолчанию.
public class Base { private Base() { } }
public class Derived extends Base { }
Это также ошибка, потому что конструктор Base без аргументов является закрытым.