14

For example:

Object o1 = new ArrayList<String>();
Object o2 = new ArrayList<String>(){};
Object o3 = new ArrayList<String>(){{}};

What's the difference?

I can't google out the 2nd/3rd grammar of Java, any reference?

4

7 回答 7

25

第一个创建一个 ArrayList

第二个创建 ArrayList 的匿名子类,它具有特定的泛型 String

第三个是相同的,但它有一个空的初始化块。

注意:在可能的情况下,您应该尽可能编写最简单、最清晰的代码,尤其是在考虑性能时。

于 2013-09-02T18:11:08.697 回答
13
Object o1 = new ArrayList<String>();

创建一个 ArrayList。

Object o2 = new ArrayList<String>(){};

在这里,您正在创建一个匿名类,它扩展ArrayList<String>并且不覆盖任何东西。因此,不同之处在于您将 ArrayList 子类化而没有过度行为,如果您没有充分的理由,请永远不要这样做

Object o3 = new ArrayList<String>(){{}};

您正在创建与 2 相同的内容,但使用了一个空的初始化程序块。

于 2013-09-02T18:09:42.370 回答
2
Object o1 = new ArrayList<String>();

创建一个新的 ArrayList 对象并将其分配给o1

Object o2 = new ArrayList<String>(){};

创建一个扩展 ArrayList 的匿名类的新实例并将其分配给o2

Object o3 = new ArrayList<String>(){{}};

创建一个(不同于o2)匿名类的新实例,该类扩展具有无操作实例初始化程序的 ArrayList。

o2在功能上分配给的匿名类o3是等效的,但从技术上讲,它们将是不同的类。

于 2013-09-02T18:13:51.793 回答
0

您正在匿名实例化一个类。您可以在后一种情况下覆盖方法,而无需在自己的文件中定义新类。

于 2013-09-02T18:11:38.080 回答
0

o3仍然是一个匿名子类的实例,ArrayList它有一个空的实例初始化块(内部{})。

于 2013-09-02T18:11:50.080 回答
0
// Instantiate an object of type `ArrayList<String>`
Object o1 = new ArrayList<String>();

// Instantiate an anonymous subclass of `ArrayList<String>`
Object o2 = new ArrayList<String>(){};

// Instantiate an anonymous subclass of `ArrayList<String>` with an empty initializer block
Object o3 = new ArrayList<String>(){{}};
于 2013-09-02T18:12:06.297 回答
0

Object o2 = new ArrayList<String>(){};
它是匿名的内部类,它扩展ArrayList类并且不覆盖任何内容。
Object o2 = new ArrayList<String>(){{}};
它也是匿名的内部类,它扩展了ArrayList类并且只覆盖了一个empty instance block.

于 2013-09-02T18:12:50.267 回答