在java中销毁对象

时间:2015-03-24 18:31:59

标签: java object

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

例如:

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

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

2 个答案:

答案 0 :(得分:12)

即可。 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和对象本身不受影响。

答案 1 :(得分:1)

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

长答案:当你创建一个变量(让它称之为A)时,严格来说你正在创建一个引用。为对象分配值时,系统会创建相关对象,并在变量中存储对它的引用。如果创建第二个变量并为其指定相同的值,则创建对同一对象的第二个引用。虽然底层对象在两种情况下都是相同的,但引用是不同的,并且可以单独操作。将值分配给预先存在的变量时,实际执行的操作是更改引用指向的位置。但是,您实际上并没有更改对象本身。在没有指定null的情况下,你实际上告诉计算机是什么"这个参考点无处可见"。

然而,其他参考文献并未受到此更改的影响,仍然指向同一位置。只要在至少一个位置仍然引用该对象,就不会通过改变赋值来实现该对象。如果它被引用 - 并且因此无法访问 - 它将被系统垃圾收集并被销毁。