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

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


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]

任何人都可以详细说明为什么INNER在“A”和“B”添加到“A”和“B”时为空和执行流程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);

    }   

}

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


OUTER : []

看完后,我完全不知道发生了什么。INNER去哪儿了?为什么不打印?不叫吗?


慕姐8265434
浏览 179回答 3
3回答

翻过高山走不出你

因为匿名类 off 的初始化块是在匿名类的实例引用被赋值给之前ArrayList执行的。var代码未执行,因为您从未调用过该add(String e)方法。如果你这样做了,它会导致一个StackOverflowError, 因为add("A")现在是一个递归调用。

尚方宝剑之说

你创建的对象var在初始化过程中没有被赋值,试试这个:private static final List<String> var = new ArrayList<String>() {{&nbsp; &nbsp; add("A");&nbsp; &nbsp; add("B");&nbsp; &nbsp; System.out.println("THIS : " + this); // THIS : [A, B]&nbsp; &nbsp; System.out.println("INNER : " + var); // INNER : null}};您只需覆盖 的add方法ArrayList,它就被调用了。它的工作原理如下:static class CustomList<E> extends ArrayList<E> {&nbsp; &nbsp; @Override&nbsp; &nbsp; public boolean add(String e) {&nbsp; &nbsp; &nbsp; &nbsp; add("A");&nbsp; &nbsp; &nbsp; &nbsp; add("B");&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("INNER : " + var);&nbsp; &nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; }}private static final List<String> var = new CustomList<>();

白板的微信

在第一个代码中,您在其构造函数返回之前打印变量,因为您添加元素并在实例初始值设定项中打印列表。所以只能打印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"));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java