Для начала немного терминологии:
- Конструктор без аргументов: конструктор без параметров;
- Доступный конструктор без аргументов: конструктор без аргументов в суперклассе, видимый для подкласса. Это означает, что он либо общедоступный, либо защищенный, либо, если оба класса находятся в одном пакете, доступ к пакету; а также
- Конструктор по умолчанию: общедоступный конструктор без аргументов, добавляемый компилятором, когда в классе нет явного конструктора.
Итак, у всех классов есть хотя бы один конструктор.
Конструкторы подклассов могут в качестве первого действия указать, какой конструктор в суперклассе вызывать перед выполнением кода в конструкторе подкласса.
Если конструктор подкласса не указывает, какой конструктор суперкласса вызывать, компилятор автоматически вызовет доступный конструктор без аргументов в суперклассе.
Если у суперкласса нет конструктора без аргументов или он недоступен, то не указание вызываемого конструктора суперкласса (в конструкторе подкласса) является ошибкой компилятора, поэтому его необходимо указать.
Например:
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 без аргументов является частным.
person
cletus
schedule
13.01.2010