正在销毁 java 中的对象
Destroying objects in java
如果我用 null
值设置对象 Java 会破坏原始对象吗?
例如:
Foo f = new Foo();
// ...
Foo b = f;
如果我现在将 b
设置为 null
,f
是否也会变成 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 的情况下,您实际上告诉计算机的是 "this reference points nowhere".
然而,其他引用不受此更改的影响,仍然指向同一个地方。只要对象在至少一个位置仍被引用,它就不会因更改分配而受到任何影响。如果它无处引用 - 因此无法访问 - 它将被系统收集为垃圾并被销毁。
如果我用 null
值设置对象 Java 会破坏原始对象吗?
例如:
Foo f = new Foo();
// ...
Foo b = f;
如果我现在将 b
设置为 null
,f
是否也会变成 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 的情况下,您实际上告诉计算机的是 "this reference points nowhere".
然而,其他引用不受此更改的影响,仍然指向同一个地方。只要对象在至少一个位置仍被引用,它就不会因更改分配而受到任何影响。如果它无处引用 - 因此无法访问 - 它将被系统收集为垃圾并被销毁。