Как указывает другой участник, B не расширяет A, поэтому он все равно не вызовет конструктор A.
Нет способа сделать это на Java.
Вероятно, вы можете выполнить то же самое, что и вы, следующим образом:
а) в каждый класс вашей иерархии включите конструктор с уникальной сигнатурой, который вызывает конструктор суперкласса со своими аргументами. Например, объявите класс «Noop» и конструктор, который принимает это в качестве аргумента:
public class NoOp {
}
public class class1 {
class1() {
System.out.println("class1() called");
}
class1(String x, String y) {
System.out.println("class1(String, String) called");
}
class1(NoOp x) {
System.out.println("class1(NoOp) called");
}
}
public class class2 extends class1 {
class2() {
System.out.println("class2() called");
}
class2(String x, String y) {
System.out.println("class2(String, String) called");
}
class2(NoOp x) {
super(x);
System.out.println("class2(NoOp) called");
}
}
public class class3 extends class2 {
class3() {
System.out.println("class3() called");
}
class3(String x, String y) {
super(new NoOp());
System.out.println("class3(String, String) called");
}
class3(NoOp x) {
super(x);
System.out.println("class3(NoOp) called");
}
public static void main(String args[]) {
class3 x = new class3("hello", "world");
}
}
Если вы запустите это, вы получите вывод
class1(NoOp) called
class2(NoOp) called
class3(String, String) called
Итак, вы фактически создали конструктор класса 3, который вызывает только конструкторы, которые ничего не делают.