在java中销毁对象

use*_*056 3 java object

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

例如:

Foo f = new Foo();
// ...
Foo b = f;
Run Code Online (Sandbox Code Playgroud)

如果我现在设置bnullf成为也null?这种行为的通用名称是什么?

T.J*_*der 12

.所有设置bnull所做的就是删除引用从对象b.f仍会有对象的引用.如果你设置fnull,那么该对象将没有未完成的引用,并最终将被垃圾回收.

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

首先我们这样做:

Foo f = new Foo();
Run Code Online (Sandbox Code Playgroud)

并在内存中得到这个:

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

(显然,#123只是为了给出一个关于ref确实有一些特定值的想法; 我们从来没有看到实际值,但JVM确实如此.)

然后,如果我们这样做:

Foo b = f;
Run Code Online (Sandbox Code Playgroud)

我们有:

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

如果我们这样做的话

b = null;
Run Code Online (Sandbox Code Playgroud)

我们有:

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

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

  • 这是事实,但一般来说,JVM通常比什么时候做GC更聪明. (2认同)