Gus*_*Gus 5 java arraylist static-initializer
我最近发现在我看来是静态初始化ArrayList的新语法:
new ArrayList() {{
add("first");
add("second");
}};
我的问题是,那里到底发生了什么?这是定义静态块的快捷方式(我认为它需要static关键字)?或者只是一种定义默认构造函数的方法?别的什么?哪个版本的Java有效?
将非常感谢解释以及进一步阅读的链接.
编辑:我的测试类,用于显示初始化程序块是否在构造函数之前或之后执行.结果显示初始化程序块在其他构造函数代码之前执行:
import org.junit.Test;
public class InitializerBlockTest {
class InitializerTest {
{
System.out.println("Running initalizer block");
}
public InitializerTest() {
System.out.println("Running default constructor");
}
}
class SubClass extends InitializerTest {
{
System.out.println("Running subclass Initializer block");
}
public SubClass() {
System.out.println("Running subclass constructor");
}
}
@Test
public void testIt() {
new SubClass();
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Running initalizer block
Running default constructor
Running subclass Initializer block
Running subclass constructor
Run Code Online (Sandbox Code Playgroud)
您正在创建一个新的ArrayList匿名子类,其中一个实例初始化程序会调用add()两次.
它与以下相同:
class MyList extends ArrayList
{
{ // This is an instance initializer; the code is invoked before the constructor.
add("first");
add("second");
}
public MyList() {
super();
// I believe initializers run here, but I have never specifically tested this
}
}
Run Code Online (Sandbox Code Playgroud)
...
List list=new MyList();
Run Code Online (Sandbox Code Playgroud)
请注意,就个人而言,我并不认为它是一种成语,因为它会导致类文件爆炸.