3 回答
TA贡献1875条经验 获得超3个赞
因为匿名类 off 的初始化块是在匿名类的实例引用被赋值给之前
ArrayList
执行的。var
代码未执行,因为您从未调用过该
add(String e)
方法。如果你这样做了,它会导致一个StackOverflowError
, 因为add("A")
现在是一个递归调用。
TA贡献1788条经验 获得超4个赞
你创建的对象var在初始化过程中没有被赋值,试试这个:
private static final List<String> var = new ArrayList<String>() {{
add("A");
add("B");
System.out.println("THIS : " + this); // THIS : [A, B]
System.out.println("INNER : " + var); // INNER : null
}};
您只需覆盖 的add方法ArrayList,它就被调用了。它的工作原理如下:
static class CustomList<E> extends ArrayList<E> {
@Override
public boolean add(String e) {
add("A");
add("B");
System.out.println("INNER : " + var);
return true;
}
}
private static final List<String> var = new CustomList<>();
TA贡献1883条经验 获得超3个赞
在第一个代码中,您在其构造函数返回之前打印变量,因为您添加元素并在实例初始值设定项中打印列表。所以只能打印null。
在第二个代码中,您重写add()以添加硬编码元素,但add()永远不会在创建的实例上调用。因此add()不会打印任何内容,也不会在 List 实例中添加任何内容。
要在 List 中添加元素,您通常希望add()在 List 引用上调用,例如:
List<String> list = new ArrayList<>();
list.add("element A");
list.add("element B");
您不会为这样的要求创建匿名类。
如果您想使用更简单的语法,您仍然可以这样做:
List<String> list = new ArrayList<>(Arrays.asList("element A", "element B"));
添加回答
举报