成员变量未能在声明时初始化

时间:2012-05-28 16:32:43

标签: java variables subclass member

使用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;
}

}

代码的重要部分是它是一个子类,我试图在声明时初始化两个成员变量。当我进入构造函数时,map和number的值分别为null和0,这是什么原因?

2 个答案:

答案 0 :(得分:4)

根据规范,在初始化B类成员之前执行基类的构造函数。

另见:Java Constructor and Field Initialization Order

答案 1 :(得分: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. 转到A
  2. 的no-param构造函数
  3. 制作名为Map的新map
  4. 制作名为int的新number
  5. 在键1处初始化map值为1。
  6. number初始化为5。
  7. 在这里完成,转到B的构造函数的其余部分。
  8. 制作名为Map的新map。这将覆盖map中构造的名为A的变量。
  9. 制作名为int的新number。这将覆盖number中构造的名为A的变量。
  10. (不要初始化map。)
  11. (不要初始化number。)
  12. 完成。
  13. 我希望这可以解决问题。如果您不希望这种情况发生,请在自己的构造函数中初始化B的字段。