Java中的块语句

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

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

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

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

这个:

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

创建一个匿名内部类 ,它是HashMap的子类。

这个:

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

是一个实例初始化器 。 在创建匿名子类的实例时执行代码。

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

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

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

只需创建一个MyMap实例并调用它,就不会涉及匿名类。