Вопрос возможно покажется глупым, но за все время которое я провел с кодом, я не придавал этому значение и делал на автомате следующее:
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() для вызова дефолтного конструктора родителя. Но не забывайте, что при таком подходе ссылочные поля суперкласса (значения которых идут от потомков) останутся неинициализированными.