java - Java 中列表如何保存对象引用/值?

标签 java object arraylist

当我将对象添加到列表并更改对象的属性时,该更改将传播到列表中的对象,但是当我将对象设置为空时,我不会从列表中的对象获得空指针。这是为什么?

public class Hworld {

    public static void main(String[]args) {

        List<Obj> list = new ArrayList<>();

        Hworld.Obj o = new Obj();

        list.add(o);

        for(Obj ob:list) {
            System.out.println(ob.b); // prints "base"
        }

        o.b="new";
        o=null;

        for(Obj ob:list) {
            System.out.println(ob.b); // prints "new"
        }

    }

    public static class Obj{

        String b = "base";

    }   
}

最佳答案

这是因为java使用引用。当您创建对象o时,堆中创建了一个新对象,并且o现在指向该位置,或者o 引用 到新创建的对象的地址。现在您已将对象 o 添加到列表中,因此该列表具有对同一位置的引用(暂时将其称为位置)。现在,您对引用o执行了.操作,这实际上更改了对象中成员变量的值。现在,您将引用 o 指向任何地方,或者只是将引用设置为null。但列表中存在对同一位置的引用,您尚未更改该引用。因此,您不会得到任何 NPE,并且您将使用 dot(.) 运算符提前更改值。 希望我能提供一些启发。

关于java - Java 中列表如何保存对象引用/值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54773074/

相关文章:

c++ - 在 C++ 中初始化为自身的对象

c++ - C++中的多维对象数组,我无法初始化它!

java - Hashset 和 Arraylist 性能

java - 比较字符串ArrayList

java - sarxos 的图书馆网络摄像头捕获不适用于覆盆子

java - 为什么 JasperViewer 只能在本地主机上运行?

javascript - 创建子对象的同时添加键/值对

java - 如何从 String 数组或 ArrayList 中删除相似元素

java - 如何创建 http :inbound-gateway with JAVA DSL config?

java - joda DateTimeFormat 的 NoClassDefFoundError