如果在将t2分配给t1时设置t1 = null会发生什么?

时间:2015-11-22 09:01:16

标签: java reference garbage-collection

Test t1 = new Test();
Test t2 = t1;
t1 = null;

t2会发生什么?该对象是垃圾收集吗?

2 个答案:

答案 0 :(得分:4)

  

如果在将t2分配给t1

时设置t1 = null会发生什么

标题中存在混淆:t2 已分配给t1。这一行:

Test t2 = t1;

t1中的复制到t2。没有正在进行的链接(除了它们具有相同的值,在这种情况下是一个称为对象引用的东西,告诉JVM在内存中找到对象的位置)。

在处理这些问题时,我喜欢一些ASCII艺术:

该行

Test t1 = new Test();

在内存中给我们这个:

+----------+
| t1       |---+
+----------+   |   +-------------+
               +-->| Test object |
                   +-------------+

然后行:

Test t2 = t1;

告诉我们:

+----------+
| t1       |---+
+----------+   |   +-------------+
               +-->| Test object |
+----------+   |   +-------------+
| t2       |---+
+----------+       

然后

t1 = null;

给我们:

+----------+
| t1: null |
+----------+       +-------------+
               +-->| Test object |
+----------+   |   +-------------+
| t2       |---+   
+----------+       

t2完全不受您对t1的攻击的影响。

答案 1 :(得分:3)

t2没有任何反应。它仍然引用最初由Testt1引用的同一t2实例,只要该引用存在,此实例就不能被垃圾回收。 / p>