gpt4 book ai didi

java - ArrayList 初始化器上的 {{ 语法到底做了什么

转载 作者:搜寻专家 更新时间:2023-10-31 08:21:18 27 4
gpt4 key购买 nike

我最近发现了一种在我看来是静态初始化 ArrayList 的新语法:

新的 ArrayList() {{
添加(“第一个”);
添加(“第二个”);
}};

我的问题是,那里到底发生了什么?这是定义静态 block 的快捷方式吗(我认为它需要 static 关键字)?或者只是一种定义默认构造函数的方法?还有别的吗?这对哪个版本的 Java 有效?

非常感谢解释和进一步阅读的链接。

编辑:下面是我的测试类,用于显示初始化 block 是在构造函数之前还是之后执行。结果显示初始化程序 block 在其他构造函数代码之前执行:

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();
}
}

输出:

Running initalizer block
Running default constructor
Running subclass Initializer block
Running subclass constructor

最佳答案

你正在创建一个新的 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
}
}

...

List list=new MyList();

请注意,就我个人而言,我不建议将其作为习惯用语,因为它会导致类文件爆炸。

关于java - ArrayList 初始化器上的 {{ 语法到底做了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4391696/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com