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