Java中的块语句

时间:2011-08-24 20:05:06

标签: java block

我有一个扩展java.util.HashMap的MyMap类,下面的代码作为一个语句块使用,但我不明白使用额外的花括号

MyMap m = new MyMap() {
  {
      put("some key", "some value");
  }
};

现在为什么我需要额外的大括号,我不能这样做(但这会引发编译错误)

MyMap m = new MyMap() {
    put("some key", "some value");
};

2 个答案:

答案 0 :(得分:11)

此:

MyMap m = new MyMap() {
    ....
};

创建anonymous inner class,它是HashMap的子类。

此:

{
    put("some key", "some value");
}

instance initializer。在创建匿名子类的实例时执行代码。

答案 1 :(得分:4)

你在这里真正做的是定义一个 MyMap 的任何子类,这可能不是你的意图......最外面的花括号围绕类内容 。在Java中,您不能将指令直接放在块中:如果您需要在实例化类时执行代码,则将其放入构造函数中。这就是最里面的大括号:它们为你的匿名类界定了一个初始化器。

现在,你可能想要这样的东西:

MyMap m = new MyMap();
m.put("some key", "some value");

只需创建MyMap的实例并在其上调用put,不涉及任何匿名类。