3

次のコードの出力が「null」である理由を誰かが知ることができますか? 複雑なオブジェクトを構築し、詳細をそのサブクラスに委譲する最良の方法は何ですか?


package com.test;

public class ClassA {

    ClassA() {
        initHeader();
        initBody();
        initFooter();
    }

    void initHeader() {}

    void initBody() {}

    void initFooter() {}

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

class ClassB extends ClassA {

    public Object obj = null;

    ClassB() {
        super();
    }

    void initHeader() {
        obj = new Object();
    }

}


4

2 に答える 2

9

まず、のフィールドClassAが初期化されます。

次に、のコンストラクタがClassA呼び出され、が呼び出されClassB.initHeader()ます。

その後、のフィールドClassBが初期化され、実行内容が上書きさinitHeader()れます。

于 2013-02-07T07:53:46.643 に答える
1

initHeaderこのコードがClassB から呼び出されないのは正しくありません。initHeader両方のクラスのメソッドにデバッグ出力を追加することで確認できます。

public Object obj = null;次の 2 つの部分が含まれます。

  1. 宣言public Object obj
  2. 実行obj = null

コンストラクターの実行時に認識される最初の部分 (現時点では objnullはデフォルトで初期化されます) 2 番目の部分は constructorの後に実行されるため、initHeaderobj をオーバーライドします。

public Object obj = null;で置き換えてみてくださいpublic Object obj;

于 2013-02-07T08:04:07.703 に答える