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

标签 java reference garbage-collection

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

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

最佳答案

What happen if I set t1=null while t2 is assigned to t1

困惑就在标题中:t2 没有分配给 t1。这一行:

Test t2 = t1;

t1 中的复制到 t2 中。没有持续的链接(除了它们具有相同的值,在本例中是一个称为“对象引用”的东西,它告诉 JVM 在内存中的何处查找对象)。

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

线路

Test t1 = new Test();

在内存中给我们这个:

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

Then the line:

Test t2 = t1;

给我们这个:

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

then

t1 = null;

给我们:

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

t2 完全不受您对 t1 所做的任何操作的影响。

关于java - 如果我在 t2 分配给 t1 时设置 t1=null 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33853171/

相关文章:

java - 事件驱动的回合制文本游戏,创建对象

java - 从 SwingWorker 执行 SwingWorker - 等待第一个停止

java - 监控和锁定说明

java - 具有相同引用的两个对象肯定是相同的?

Java 线程终止引用

go - 如何在 Go 中发布 http.Client?

java - 在 Java 中注册长 GC 时间事件

java - FCM : onMessageReceived is not called, 即使在向 fcm 发送消息后也没有收到通知?

reference - 为什么我可以将不可变引用传递给 BufReader,而不是可变引用?

java - jvm8 中的元空间大小是多少?