add() 方法何时在集合中添加对象

2022-09-04 08:43:20

我有两个问题。首先,考虑下面的代码。

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

当我运行此代码时,它会给我以下输出

INNER : null
OUTER : [A, B]

任何人都可以详细说明为什么在“A”和“B”恰好添加时是空和执行流?INNERcollection

其次,我对上面的代码进行了一些更改,并修改为下面的代码(只需将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);
    }   
}

运行上面的代码后,我得到了下面的结果

OUTER : []

看完这篇文章后,我对这里发生的事情一无所知。去哪儿了?为什么不打印?它不是被叫吗?INNER


答案 1
  1. 因为匿名类 off 的初始值设定项块是在将匿名类的实例引用分配给 之前执行的。ArrayListvar

  2. 不执行代码,因为您从不调用该方法。如果这样做,它将导致 ,因为现在是递归调用。add(String e)StackOverflowErroradd("A")


答案 2
  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
    }};
    
  2. 你只是覆盖的方法,它被调用了。它的工作原理如下:addArrayList

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

推荐