[英]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的情况下,你实际告诉计算机的是“这个参考点无处可去”。
然而,其他参考文献不受这种改变的影响,仍然指向相同的地方。 只要在至少一个位置仍然引用该对象,就不会通过改变赋值来实现该对象。 如果它被无处引用 - 并且因此无法访问 - 它将被系统垃圾收集并被销毁。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.