什么时候add()方法在集合中添加对象

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

  1. 因为匿名类关闭的初始化程序块是在分配匿名类的实例引用之前ArrayList执行的.var

  2. 代码未执行,因为您从未调用该add(String e)方法.如果你这样做,那将导致a StackOverflowError,因为add("A")现在是一个递归调用.

  • @RBS`add(String e)`里面的第一个语句是`add("A")`,它是对它自己的调用,所以它执行`add("A")`,这是对它自己的调用,所以它执行`add("A")`,这是对它自己的调用,所以它执行`add("A")`,这是对它自己的调用,所以它执行`add("A")`,是对它自己的调用,所以它执行`add("A")`和**StackOverflowError**. (5认同)

孙兴斌*_*孙兴斌 5

  1. 您创建的对象尚未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)
  2. 你只是覆盖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)