在Java中销毁对象

3
如果我将一个对象设置为null值,Java会销毁原始对象吗?
例如:
Foo f = new Foo();
// ...
Foo b = f;

如果我现在将b设置为null,那么f也会变成null吗?这种行为的通用名称是什么?

2
这是一个荒谬的问题。为什么不直接尝试一下看看? - Dawood ibn Kareem
2个回答

12

。将b设置为null只是从b中删除对该对象的引用。f仍将具有对该对象的引用。如果您还将f设置为null,那么该对象将没有任何未完成的引用,并最终被垃圾回收。

让我们来看一下ASCII艺术:

首先,我们这样做:

Foo f = new Foo();

并将其存储在内存中:

+------------+
|     f      |
+------------+     +-----------------------+
| (引用 #123) |---->|       Foo #123        |
+------------+     +-----------------------+
                   | (对象的数据)           |
                   +-----------------------+

(显然,那个 #123 只是为了给出引用具有某些特定值的想法;我们从未看到实际值,但是JVM会。)

然后如果我们做这个:

Foo b = f;

我们有:

+------------+
|     f      |
+------------+
| (引用 #123) |--+
+------------+  |
                |
                |  +-----------------------+
                +->|       Foo #123        |
+------------+  |  +-----------------------+
|     b      |  |  | (该对象的数据)          |
+------------+  |  +-----------------------+
| (引用 #123) |--+
+------------+ 

那么如果我们执行:

b = null;

我们有:

+------------+
|     f      |
+------------+     +-----------------------+
| (Ref #123) |---->|       Foo #123        |
+------------+     +-----------------------+
                   | (数据对象)            |
+------------+     +-----------------------+
|     b      |
+------------+
| null       |
+------------+ 

正如您所看到的,f和对象本身没有受到影响。


如果你想的话,你可以调用system.gc()或garbagecollect()来加速它。 - avk
@avk:如果你指的是System.gc,那么是的,它会要求JVM尽力清理。 - T.J. Crowder
2
这是正确的,但一般来说,JVM通常比你更聪明地知道何时进行垃圾回收。 - Louis Wasserman
通常情况下是这样的。True。 - avk
如果在 ASCII-art 后面加上一个加号,那么最后如果 f 被设置为 null,则对象仍然存在于内存中,但无法通过任何变量访问,完全取决于 JVM 垃圾回收何时将其删除。 - singhakash

1
简短回答:不会。无论其他指向同一对象的引用发生什么变化,原始引用都将保持不变。
详细回答:当您创建一个变量(我们称其为A)时,严格来说,您正在创建一个引用。当您将值分配给该对象时,系统会创建相应的对象,并在变量中存储对它的引用。如果您创建第二个变量并将其赋予相同的值,则您正在创建对同一对象的第二个引用。尽管这两种情况下的基础对象是相同的,但引用是不同的,可以分别操作。当您将值分配给现有变量时,实际上正在更改引用指向的位置。但是,您实际上并没有更改对象本身。在未分配null的情况下,您实际上告诉计算机“此引用指向无处”。
然而,其他引用不受此更改影响,仍然指向同一位置。只要至少在一个位置引用了该对象,该对象就不会受到任何影响。如果它没有被引用 - 因此是不可达的 - 系统将通过垃圾回收将其销毁。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接