首页 > 解决方案 > 使对象为空

问题描述

在下面的代码中,我将 ex1 对象添加到 ArrayList。然后我将 ex1 对象设为空。但是当我从arraylist返回对象时,它仍然是以前的值没有更改为null。这是为什么?正如我认为所有的参考变量都指的是堆中的同一个对象。所以它应该是空的

List<Example> ex = new ArrayList<>();
    Stack<Example> st = new Stack<>();
    Example ex1 = new Example();
    ex1.age = 15;
    ex.add(ex1);
    st.push(ex1);
    ex1 = null;
    //System.out.println(ex1.age);
    System.out.println(ex.get(0).age);
    System.out.println(st.peek().age);

输出为 15

标签: javavariable-assignment

解决方案


Java 语言规范中描述了此行为。

当调用方法或构造函数时(第 15.12 节),实际参数表达式的值在执行方法或构造函数的主体之前初始化新创建的参数变量,每个声明的类型。

所以当你调用add方法时,引用被复制,并且这个副本被存储。将原始参考更改为指向对null复制的参考没有影响。

您可以做的是将复制的引用传递给AtomicReference. 因此,虽然您复制的所有引用都指向 的相同位置,但AtomicReference您可以更新此引用指向的位置。


推荐阅读