如果我设置一个null
值的对象,Java会破坏原始对象吗?
例如:
Foo f = new Foo();
// ...
Foo b = f;
如果我现在将b
设为null
f
也变为null
吗?这种行为的通用名称是什么?
答案 0 :(得分:12)
否即可。 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
和对象本身不受影响。
答案 1 :(得分:1)
简答:不会。无论对同一对象的其他引用发生什么情况,原始引用都将保持不变。
长答案:当你创建一个变量(让它称之为A)时,严格来说你正在创建一个引用。为对象分配值时,系统会创建相关对象,并在变量中存储对它的引用。如果创建第二个变量并为其指定相同的值,则创建对同一对象的第二个引用。虽然底层对象在两种情况下都是相同的,但引用是不同的,并且可以单独操作。将值分配给预先存在的变量时,实际执行的操作是更改引用指向的位置。但是,您实际上并没有更改对象本身。在没有指定null的情况下,你实际上告诉计算机是什么"这个参考点无处可见"。
然而,其他参考文献并未受到此更改的影响,仍然指向同一位置。只要在至少一个位置仍然引用该对象,就不会通过改变赋值来实现该对象。如果它被引用 - 并且因此无法访问 - 它将被系统垃圾收集并被销毁。