class TestEntity {
public int x;
public int y;
public TestEntity(int x, int y) {
this.x = x;
this.y = y;
}
public String toString() {
return super.toString() + ", x -> " + x + ", y -> " + y;
}
}
TestEntity t = new TestEntity(666, 777);
List<TestEntity> list = new ArrayList<>();
list.add(t);
t = null;
System.out.println(list.get(0));
为什么使用
正确打印list.get(0)
@ xxxxx,x - &gt; 666,y - &gt; 777
如果我删除t = null;
并执行t.x = 888
,则打印效果正确。
答案 0 :(得分:0)
当您在t
中添加list
时,t
和list
的第一个元素会引用相同的对象。
但是当您撰写t = null
时,它会将null
分配给t
变量。
因此,现在t
和list
的第一个元素不再引用同一个对象。
因此,打印第一个或第二个将产生明显的结果。
在您撰写t.x = 888
时,t
和list
的第一个元素仍然指向同一个对象。
您只更改对象字段的值
因此,打印第一个或第二个给出完全相同的结果。
答案 1 :(得分:0)
您没有将对象设置为null。您要将对象的引用设置为null。
t
是对象的引用。致电list.add(t)
时,您会在列表中存储此引用的副本(我们称之为t2
)。所以你最终得到了
t -----> theObject
^
|
ArrayList [t2]
两个引用都指向同一个对象。
现在,当您执行t = null
时,您只需更改t
指向的内容即可。存储在列表中的副本并不关心这一点。现在只有t
指向根本没有对象(null)。所以你最终得到了
t--> nothing theObject
^
|
ArrayList [t2]
因此,打印列表的第一个元素仍然会打印t2
引用的对象,这是列表内部数组中的第一个引用。