正在销毁 java 中的对象

Destroying objects in java

如果我用 null 值设置对象 Java 会破坏原始对象吗?

例如:

Foo f = new Foo();
// ...
Foo b = f;

如果我现在将 b 设置为 nullf 是否也会变成 null?此行为的通用名称是什么?

bnull 的所有设置都是从​​ b 中删除对对象的引用。 f 仍然会引用该对象。如果您 f 设置为 null,那么该对象将没有未完成的引用,最终将被垃圾回收。

让我们在这里抛出一些 ASCII 艺术:

首先我们这样做:

Foo f = new Foo();

并在内存中获取:

+------------+
|     f      |
+------------+     +-----------------------+
| (Ref #123) |---->|       Foo #123        |
+------------+     +-----------------------+
                   | (data for the object) |
                   +-----------------------+

(很明显,#123 只是为了说明 ref 确实有一些特定的值;我们 从来没有看到那个实际值,但是JVM 会。)

那么如果我们这样做:

Foo b = f;

我们有:

+------------+
|     f      |
+------------+
| (Ref #123) |--+
+------------+  |
                |
                |  +-----------------------+
                +->|       Foo #123        |
+------------+  |  +-----------------------+
|     b      |  |  | (data for the object) |
+------------+  |  +-----------------------+
| (Ref #123) |--+
+------------+ 

那么如果我们这样做

b = null;

我们有:

+------------+
|     f      |
+------------+     +-----------------------+
| (Ref #123) |---->|       Foo #123        |
+------------+     +-----------------------+
                   | (data for the object) |
+------------+     +-----------------------+
|     b      |
+------------+
| null       |
+------------+ 

如您所见,f和对象本身不受影响。

简短回答:不会。无论对同一对象的其他引用发生什么情况,原始引用都将保持不变。

长答案:当你创建一个变量(我们称之为 A)时,严格来说你是在创建一个引用。当您为对象赋值时,系统会创建相关对象,并将对它的引用存储在变量中。如果您创建第二个变量并为其分配相同的值,则您正在创建对同一对象的第二个引用。尽管两种情况下的底层对象相同,但引用不同,并且可以分别进行操作。当您为预先存在的变量赋值时,您实际上是在更改引用指向的位置。但是,您实际上并没有更改对象本身。在没有分配 null 的情况下,您实际上告诉计算机的是 "this reference points nowhere".

然而,其他引用不受此更改的影响,仍然指向同一个地方。只要对象在至少一个位置仍被引用,它就不会因更改分配而受到任何影响。如果它无处引用 - 因此无法访问 - 它将被系统收集为垃圾并被销毁。