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?
第一个创建一个 ArrayList
第二个创建 ArrayList 的匿名子类,它具有特定的泛型 String
第三个是相同的,但它有一个空的初始化块。
注意:在可能的情况下,您应该尽可能编写最简单、最清晰的代码,尤其是在考虑性能时。
Object o1 = new ArrayList<String>();
创建一个 ArrayList。
Object o2 = new ArrayList<String>(){};
在这里,您正在创建一个匿名类,它扩展ArrayList<String>
并且不覆盖任何东西。因此,不同之处在于您将 ArrayList 子类化而没有过度行为,如果您没有充分的理由,请永远不要这样做。
Object o3 = new ArrayList<String>(){{}};
您正在创建与 2 相同的内容,但使用了一个空的初始化程序块。
Object o1 = new ArrayList<String>();
创建一个新的 ArrayList 对象并将其分配给o1
Object o2 = new ArrayList<String>(){};
创建一个扩展 ArrayList 的匿名类的新实例并将其分配给o2
Object o3 = new ArrayList<String>(){{}};
创建一个(不同于o2
)匿名类的新实例,该类扩展具有无操作实例初始化程序的 ArrayList。
o2
在功能上分配给的匿名类o3
是等效的,但从技术上讲,它们将是不同的类。
您正在匿名实例化一个类。您可以在后一种情况下覆盖方法,而无需在自己的文件中定义新类。
o3
仍然是一个匿名子类的实例,ArrayList
它有一个空的实例初始化块(内部{}
)。
// 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>(){{}};
Object o2 = new ArrayList<String>(){};
它是匿名的内部类,它扩展ArrayList
类并且不覆盖任何内容。
Object o2 = new ArrayList<String>(){{}};
它也是匿名的内部类,它扩展了ArrayList
类并且只覆盖了一个empty instance block
.