如果我将一个对象设置为
例如:
如果我现在将
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 | +------------+ +-----------------------+ | (引用 #123) |---->| Foo #123 | +------------+ +-----------------------+ | (对象的数据) | +-----------------------+
(显然,那个 #123 只是为了给出引用具有某些特定值的想法;我们从未看到实际值,但是JVM会。)
然后如果我们做这个:
Foo b = f;
我们有:
+------------+ | f | +------------+ | (引用 #123) |--+ +------------+ | | | +-----------------------+ +->| Foo #123 | +------------+ | +-----------------------+ | b | | | (该对象的数据) | +------------+ | +-----------------------+ | (引用 #123) |--+ +------------+
那么如果我们执行:
b = null;
我们有:
+------------+ | f | +------------+ +-----------------------+ | (Ref #123) |---->| Foo #123 | +------------+ +-----------------------+ | (数据对象) | +------------+ +-----------------------+ | b | +------------+ | null | +------------+
正如您所看到的,f
和对象本身没有受到影响。
ASCII-art
后面加上一个加号,那么最后如果 f 被设置为 null,则对象仍然存在于内存中,但无法通过任何变量访问,完全取决于 JVM 垃圾回收何时将其删除。 - singhakash