Когда вы расширяете класс, вам все равно нужно вызвать его конструктор, чтобы вы могли инициализировать класс и его поля.Конструктор Pet
принимает строку.По умолчанию, когда вы расширяете класс (как это делает Puppy
), компилятор добавляет неявный вызов в конструктор без аргументов для удобства.Поскольку Pet
не имеет конструктора без аргументов, этот код не компилируется.
Вы можете исправить это, вызвав конструктор, который явно принимает строку:
class Puppy extends Pet {
Puppy(String name) {
super("Puppy called " + name);
}
}
или
class Puppy extends Pet {
Puppy() {
super("Puppy");
}
}
Аналогично (хотя вы, вероятно, не хотите этого делать), ваш код скомпилируется, если вы удалите конструктор из Pet
, потому что все будет происходить неявно:
class Pet {
}
class Puppy extends Pet {
}
Внутренне компилятор превращает это в:
class Pet {
Pet() {
// do nothing
}
}
class Puppy extends Pet {
Puppy() {
super(); // call Pet's constructor
}
}