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