繁体   English   中英

在java中销毁对象

[英]Destroying objects in java

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

例如:

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

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

b设置为null所有操作都是从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的情况下,你实际告诉计算机的是“这个参考点无处可去”。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM