親コンストラクタからの子クラスのメソッド呼び出し

親クラスのコンストラクタから子クラスのメソッドを呼び出したら変な動作になった。
そのうちハマるかもしれないのでメモ。

ソースファイルは以下の通り。
親クラスのコンストラクタから、親/子クラスのload()を呼び出す。


public class Child extends Parent {

private String child_val = null;

Child() {
super();
}

protected String getChildVal() {
return child_val;
}

protected void load() {
super.load();
child_val = "child value";
System.out.println("child_val was set.");
}

public static void main(String[] args) {
Child obj = new Child();
System.out.println(obj.getParentVal());
System.out.println(obj.getChildVal());
}

}

class Parent {

private String parent_val = null;

Parent() {
load();
}

protected String getParentVal() {
return parent_val;
}

protected void load() {
parent_val = "parent_value";
System.out.println("parent_value was set.");
}

}

実行結果は以下の通り。


parent_value was set.
child_val was set.
parent_value
null
子クラスのload()は呼ばれてるはずなのに、child_valがセットされていない。
子クラスのload()メソッド呼出し後、親クラスのコンストラクタに処理が戻るのが原因かも。親クラスにはchild_valeフィールドはないし。