为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕姐8265434 2021-11-03 15:19:40
我有两个问题。首先,考虑下面的代码。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 : nullOUTER : [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去哪儿了?为什么不打印?不叫吗?
查看完整描述

3 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

  1. 因为匿名类 off 的初始化块是在匿名类的实例引用被赋值给之前ArrayList执行的。var

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


查看完整回答
反对 回复 2021-11-03
?
尚方宝剑之说

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


查看完整回答
反对 回复 2021-11-03
?
白板的微信

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


查看完整回答
反对 回复 2021-11-03
  • 3 回答
  • 0 关注
  • 175 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信