Java中的“new Foo(){}”与“new Foo()”

时间:2013-09-02 18:08:06

标签: java arraylist

例如:

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

有什么区别?

我不能谷歌java的第2 /第3语法,任何参考?

7 个答案:

答案 0 :(得分:25)

第一个创建一个ArrayList

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

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

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

答案 1 :(得分:13)

Object o1 = new ArrayList<String>();

创建一个ArrayList。

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

在这里,您要创建一个扩展ArrayList<String>并且不会覆盖任何内容的匿名类。所以区别在于你是在没有覆盖行为的情况下继承ArrayList,如果你没有充分的理由就不会这样做

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

你创建的是2,但是有一个空的initalizer块。

答案 2 :(得分:2)

Object o1 = new ArrayList<String>();

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

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

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

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分: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>(){{}};

答案 6 :(得分:0)

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