メンバ変数宣言時の初期化=コンストラクタによる初期化

適当にわけのわからない処理を生産してたらよくわからないことになってハマったのでメモっておく。

上記の実行結果は以下のようになる。

parent
null

ChildInitAtMemberDeclを逆コンパイルすると以下のようになる。

class ChildInitAtMemberDecl extends ParentInitAtMemberDecl
{

    ChildInitAtMemberDecl()
    {
        childStr = null;
    }

    protected void init()
    {
        super.init();
        childStr = "child";
    }

    public String getChildStr()
    {
        return childStr;
    }

    private String childStr;
}

見て分かる通り、メンバ変数宣言時に初期化 = コンストラクタで初期化となる。

ChildInitAtMemberDeclの初期化手順は以下のようになる。

  1. ChildのコンストラクタでParentのコンストラクタを呼ぶ
  2. ParentのコンストラクタからChildでオーバーライドしたinitが呼ばれる
  3. super.initでparentStrに文字列をセット
  4. Childのinitに処理が戻り、childStrに文字列をセット
  5. Parentのコンストラクタに処理が戻る
  6. Childのコンストラクタに処理が戻り、childStrにnullをセット


まあ、(前記事に引き続き)最初からこんなコーディングするなという話……。