2017-09-01 89 views
-5
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 - > 666,Y - > 777

如果我删除t = null;,做t.x = 888,打印看起来是正确的。

+2

你能在问题上更清楚一点吗? – Stultuske

+0

't = null;'只是取消引用变量't',但不会改变它之前引用的TestEntity对象上的任何内容。你应该学习/搜索关于“java参考” – Joel

+0

你能定义你的结果,以及你的期望吗? – Nathan

回答

0

当您在list,t中添加t时,list的第一个元素引用同一个对象。

但是,当您编写t = null时,它会将null分配给t变量。
因此,现在tlist的第一个元素不再指向同一个对象。
因此,打印第一个或第二个将产生不同的结果。

在编写t.x = 888,tlist的第一个元素时,仍指向同一个对象。
您只更改对象字段的值。
因此,打印第一个或第二个给出完全相同的结果。

0

您没有将对象设置为null。您正在将参考设置为null。

t是对对象的引用。当拨打list.add(t)时,您将在此列表中存储该参考文件的副本(我们称之为t2)。所以你最终与

t -----> theObject 
     ^
      |   
ArrayList [t2] 

两个引用都指向同一个对象。

现在,当您执行t = null时,您只需更改t指向的内容即可。存储在列表中的副本不关心这一点。现在只有t指向没有对象(null)。所以你最终

t--> nothing theObject 
       ^
        |   
     ArrayList [t2] 

所以,打印在列表的第一个元素仍打印由t2,列表内部阵列中的第一参考引用的对象。

相关问题