这是可能的,但不是你拥有它的方式。
您必须向基类添加一个无参数构造函数,就是这样!
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";
}
}
当您不向类添加构造函数 ( any ) 时,编译器会为您添加默认的 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(); // internally setting "A" "B", "C" etc.
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 构造函数的方法签名,则必须更改所有子类。
这就是为什么继承是造成高耦合的产物,这在 OO 系统中是不可取的。应该避免它,也许应该用组合来代替。
想想你是否真的需要它们作为子类。这就是为什么您经常看到使用 insted 的接口:
public interface NameAware {
public String getName();
}
class A implements NameAware ...
class B implements NameAware ...
class C ... etc.
这里 B 和 C 可以从 A 继承,这将在它们之间创建一个非常高的耦合,通过使用接口,耦合减少了,如果 A 决定它将不再是“NameAware”,其他类不会破坏。
当然,如果你想重用行为,这是行不通的。