例如:
Object o1 = new ArrayList<String>();
Object o2 = new ArrayList<String>(){};
Object o3 = new ArrayList<String>(){{}};
有什么区别?
我不能谷歌java的第2 /第3语法,任何参考?
答案 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。
从功能上分配给o2
和o3
的匿名类是等效的,但从技术上讲,它们将是不同的类。
答案 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
。