[Resolved] Зачем объявлять конструктор в подклассе, когда он определен в суперкласcе.

Вопрос возможно покажется глупым, но за все время которое я провел с кодом, я не придавал этому значение и делал на автомате следующее:

public abstract Page(){
String string;
public Page(String string){
this.string=string;
}
}
***
public A1 extends Page{
public A1(String string){
super(string}
}
}
***
public A2 extends Page{
public A2(){
super("asd"}
}
}

А зачем в подклассах вообще прописывается конструктор, если он уже имеется в подклассе? (я знаю что если его не будет то выдаст ошибку: Implicit super constructor Page() is undefined for default constructor. Must define an explicit constructor)

Я так полагаю, имелся ввиду суперкласс?

Любой класс должен содержать конструктор. Если вы его явно не объявляете, то он генерируется неявно автоматически (дефолтный, без параметров). В случае, если вы объявили параметризованный конструктор, то дефолтный не генерируется. Отсюда и ошибка, которую вы видите при наследовании. Конструкторы не наследуются. Вы должны явно или неявно вызвать параметризованный или дефолтный конструктор суперкласса, чтобы завершить цепочку наследования. Т.е. самым простым решением (если хотите избавиться от конструкторов потомков) в вашем случае будет объявление дефолтного пустого конструктора на уровне суперкласса. Тогда чайлд классы будут неявно дергать super() для вызова дефолтного конструктора родителя. Но не забывайте, что при таком подходе ссылочные поля суперкласса (значения которых идут от потомков) останутся неинициализированными.

4 лайка
public A2 extends Page{
public A2(){
super("asd"}
}

А в данном коде мы ссылаемся на конструктор с параметрами String верно? т.е. тот который находится опять же в Page?

Да, вы можете с зажатым Ctrl (если используете IntelliJ IDEA) кликнуть по super("asd") и увидеть, на какой конструктор оно ссылается.

2 лайка

Спасибо, все понятно и доходчиво объяснили.

Не забываем ставить лайк , если какой-то из ответов оказался вам полезным. :wink:

1 лайк