RBS*_*RBS 13 java collections static arraylist
我有两个问题.首先,请考虑以下代码.
public class Test{
private static final List<String> var = new ArrayList<String>() {{
add("A");
add("B");
System.out.println("INNER : " + var);
}};
public static void main(String... args){
System.out.println("OUTER : " + var);
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,它给出了我的输出
INNER : null
OUTER : [A, B]
Run Code Online (Sandbox Code Playgroud)
任何人都可以详细说明为什么INNER在确定"A"和"B"添加到的时候为什么是null和执行collection?
其次,我在上面的代码中做了一些修改并修改为一个以下(只是把add方法放在第一个括号内)
public class Test{
private static final List<String> var = new ArrayList<String>() {
public boolean add(String e) {
add("A");
add("B");
System.out.println("INNER : " + var); return true;
};
};
public static void main(String... args){
System.out.println("OUTER : "+var);
}
}
Run Code Online (Sandbox Code Playgroud)
运行上面的代码后我得到了以下结果
OUTER : []
Run Code Online (Sandbox Code Playgroud)
看完之后,我对这件事情一无所知.哪INNER去了?为什么不打印?不叫吗?
And*_*eas 13
因为匿名类关闭的初始化程序块是在分配匿名类的实例引用之前ArrayList执行的.var
代码未执行,因为您从未调用该add(String e)方法.如果你这样做,那将导致a StackOverflowError,因为add("A")现在是一个递归调用.
您创建的对象尚未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
}};
Run Code Online (Sandbox Code Playgroud)你只是覆盖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<>();
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
633 次 |
| 最近记录: |