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

}

代码的重要部分是它是一个子类,并且我试图在声明时初始化两个成员变量。当我进入构造函数时,map 和 number 的值分别为 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. 转到 的无参数构造函数A
  2. 新建一个Map名为map.
  3. 新建一个int名为number.
  4. map在键 1 处使用值 1 进行初始化。
  5. 初始化number为 5。
  6. 在这里完成,进入其余B的构造函数。
  7. 新建一个Map名为map. 这将覆盖名为mapconstructor的变量A
  8. 新建一个int名为number. 这将覆盖名为numberconstructor的变量A
  9. (不要初始化map。)
  10. (不要初始化number。)
  11. 完毕。

我希望这能解决问题。如果您不希望这种情况发生,请B在其自己的构造函数中初始化 的字段。

于 2012-05-28T17:17:56.000 回答