私はこの継承構造を持っています:
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
を呼び出すことは可能ですか?
そうではないと思います。呼び出す抽象メソッド [1]を追加し、 sをオーバーライドする必要があります。
しかし、私は正確な理由を知りたかっただけであり、可能であれば、サブクラスのコンストラクターを呼び出すことが悪い考えである理由を証明する例 (サブクラスのコンストラクターが.Kid
init()
Mom
Kid
super()
// in Mom:
protected abstract void init();
public Mom() {
dummy = 0;
init();
}
// in Kid:
@Override
protected abstract void init() {
foo = "";
}