很多时候,我们会看到 new ArrayList
new ArrayList2、探究(){{ add("小明"); add("小红"); }};
- 为了方便研究这种写法可行的原因,我们对双花括号进行逐层研究。我们先研究外层的花括号。
new ArrayList(){};
- 看到这里,明眼人应该已经看出来这其实是匿名内部类的写法。如果还看不出来的话,可以在看看下面的代码。
new ArrayList(){ @Override public boolean add(String s) { return super.add(s); } };
-
换成这种形式后,就更容易看出来了。new ArrayList
(){}实际上就是 创建了ArrayList的一个匿名内部类的对象,只不过我们没有重写其任何方法而已。 -
外层花括号研究完毕,我们研究内层的花括号
new ArrayList(){ //构造代码块 { add("小明"); add("小红"); } };
- 很显然,既然是内部类,我当然可以有构造代码块。所以实际上,里面的{}是匿名内部类的构造代码块而已。如果不好理解的话,看看以下代码。
new ArrayList3、结语(){ //构造代码块 { add("小明"); add("小红"); } //重写父类方法 @Override public boolean add(String s) { return super.add(s); } //自己的方法 public void sayHello(){ System.out.println("hello"); } };
之前一直知道这种写法,自己也这么写过。但是始终觉得这种写法很怪异 ,今天终于抽空简单研究一下。原来就是一个匿名内部类加一个构造代码块。



