Это возможно, но не так, как у вас.
Вам нужно добавить в базовый класс конструктор без аргументов, и все!
public abstract class A {
private String name;
public A(){
this.name = getName();
}
public abstract String getName();
public String toString(){
return "simple class name: " + this.getClass().getSimpleName() + " name:\"" + this.name + "\"";
}
}
class B extends A {
public String getName(){
return "my name is B";
}
public static void main( String [] args ) {
System.out.println( new C() );
}
}
class C extends A {
public String getName() {
return "Zee";
}
}
Если вы не добавляете конструктор (любой) к классу, компилятор добавляет для вас конструктор по умолчанию no arg.
Когда defualt no arg вызывает super (); и поскольку у вас его нет в суперклассе, вы получите это сообщение об ошибке.
Это о самом вопросе.
Теперь, расширяя ответ:
Вы знаете, что создание подкласса (поведения) для указания другого значения (данных) не имеет смысла ?? !!! Я надеюсь, что да.
Если единственное, что меняется - это "имя", тогда достаточно одного параметризованного класса!
Так что вам это не нужно:
MyClass a = new A("A");
MyClass b = new B("B");
MyClass c = new C("C");
MyClass d = new D("D");
или
MyClass a = new A();
MyClass b = new B();
MyClass c = new C();
MyClass d = new D();
Когда можно написать это:
MyClass a = new MyClass("A");
MyClass b = new MyClass("B");
MyClass c = new MyClass("C");
MyClass d = new MyClass("D");
Если бы мне пришлось изменить сигнатуру метода конструктора BaseClass, мне пришлось бы изменить все подклассы.
Вот почему наследование - это артефакт, который создает ВЫСОКОЕ сцепление, что нежелательно в объектно-ориентированных системах. Его следует избегать и, возможно, заменить композицией.
Подумайте, действительно ли они вам действительно нужны как подкласс. Вот почему вы часто видите встроенные интерфейсы:
public interface NameAware {
public String getName();
}
class A implements NameAware ...
class B implements NameAware ...
class C ... etc.
Здесь B и C могли унаследовать от A, что создало бы очень ВЫСОКУЮ связь между ними, при использовании интерфейсов связь уменьшается, если A решает, что он больше не будет «NameAware», другие классы не сломаются.
Конечно, если вы хотите повторно использовать поведение, это не сработает.