0

Java を使用して、宣言時にメンバー変数を初期化しようとしていますが、何らかの理由で変数はデフォルト値 (0、null など) のままです。

私が達成しようとしていることを示すコード例のスニペットをご覧ください。

public class B extends A {

Map<Integer, Integer> map = new HashMap <Integer, Integer>();
int number = 10;

public B() {
  super();
}

public Map getMap() {
  return map;
}

public int getNumber() {
  return number;
}

}

コードの重要な部分は、それがサブクラスであることと、宣言時に 2 つのメンバー変数を初期化しようとしていることです。コンストラクターにステップインすると、マップと数値の値がそれぞれ null と 0 になります。これは何が原因ですか?

4

2 に答える 2

4

仕様により、基本クラスのコンストラクターは、クラス B のメンバーを初期化する前に実行されます。

ここも参照してください: Java コンストラクターとフィールドの初期化順序

于 2012-05-28T16:38:03.177 に答える
0

私の推測では、ここで何が起こっているのですか:

    class A {
        protected Map<Integer,Integer> map;
        protected int number;

        public A() {
            map=new Map() {{ //This is just initializing the map
                put(1,1);
            }}
            number=5;
        }
    }

    public class B extends A {

        Map<Integer, Integer> map = new HashMap <Integer, Integer>();
        int number = 10;

        public B() {
          super();
        }
    }

Bコンパイラの観点から、コンストラクタで何が起こるかを次に示します。

  1. の no-param コンストラクターに移動しAます。
  2. Mapと呼ばれる新しいものを作りmapます。
  3. intと呼ばれる新しいものを作りnumberます。
  4. mapキー 1 の値 1 で初期化します。
  5. 5 に初期化numberします。
  6. ここで完了し、残りのBのコンストラクターに移動します。
  7. Mapと呼ばれる新しいものを作りmapます。mapこれは、で構築されたという変数をオーバーライドしますA
  8. intと呼ばれる新しいものを作りnumberます。numberこれは、で構築されたという変数をオーバーライドしますA
  9. (初期化しないでくださいmap。)
  10. (初期化しないでくださいnumber。)
  11. 終わり。

これで問題が解決することを願っています。それが発生したくない場合はB、独自のコンストラクターで のフィールドを初期化します。

于 2012-05-28T17:17:56.000 に答える