我有这个继承结构:
public abstract class Mom {
int dummy;
Mom() {
dummy = 0;
}
Mom(int d) {
this();
dummy = d;
}
}
public class Kid extends Mom {
String foo;
Kid() {
super();
foo = "";
}
Kid(int d) {
super(d);
}
}
// ...
Kid kiddo = new Kid(10);
// kiddo.foo == null !
我的无参数构造函数Kid
永远不会被调用!这是我的预期:
new Kid(10)
→Kid#Kid(int)
super(d)
→Mom#Mom(int)
this()
→Kid#Kid()
// 哇!!super()
→Mom#Mom()
是否可以从Mom
调用Kid
的无参数构造函数?
我想它不是,我将添加一个抽象方法[1] init()
,Mom
它将调用并且Kid
s必须覆盖。
但我只是想知道确切的原因,如果可能的话,例子证明为什么想要调用子类的构造函数是一个坏主意(即使子类的构造函数确实调用了super()
)。
// in Mom:
protected abstract void init();
public Mom() {
dummy = 0;
init();
}
// in Kid:
@Override
protected abstract void init() {
foo = "";
}