将对象的所有引用设置为null

8
在Java中,我该如何做以下操作:
Foo bar = new Foo();
Foo a = bar;
Foo b = bar;
bar = null;//will only set bar to null. want to set value of bar to null rather than the reference to null.

是否可以只通过访问bar来将变量barab(它们都是对bar的引用)设置为null?如果可以,请有人解释一下如何操作。


2
不,这在Java中是不可能的。关于变量赋值的规则意味着您必须使用变量名称来进行赋值。 - Nayuki
我认为当你将bar设置为空时,a和b也会有空引用。那么问题出在哪里呢? - The Law
请阅读此教程:http://www.javaranch.com/campfire/StoryPassBy.jsp - Nayuki
@TheLaw 关于您的问题,我认为当您将bar设置为null时,a和b也会具有null引用。在这种情况下,a和b是来自new Foo()的不同对象,并且拥有bar中数据的副本。 - Jason K.
3个回答

7
不,Java不支持此操作。
简单介绍一下你代码中发生的事情。在这里,Foo bar = new Foo(); 你创建了一个 Foo 类的对象,并将引用放在变量 bar 中。
在这里,Foo a = bar;Foo b = bar;,你将引用放到变量 ab 中。所以你现在有一个对象和三个指向它的变量。
在这里,bar = null;,你清除了变量 bar 的引用。所以你现在有两个指向该对象的变量(ab),还有一个没有引用的变量(bar)。

5

在Java中是不可能的。您无法使用bar将引用ab设置为null。

原因 - Java是按值传递,而不是按引用传递。


14
我不认为这是正确的原因。“按值/按引用传递”是方法调用的评估策略。这里没有调用任何方法。 - xehpuk

2

Java中并没有像C语言中那样的析构函数:

如果你想将多个对象设置为null,那么你可能会使用Foo数组而不是将它们声明为单独的对象。然后使用循环进行构造函数调用、实例化和初始化。

Foo bar = new Foo();
Foo array[2]
for (int i=0; i<array.length; i++) {
    array[i] = bar;
}

然后你可以在结尾处使用循环。
for (int i=0; i<array.length; i++) {
    array[i] = null;
}

这是数据结构中需要的策略,因为可以处理任意数量的对象,用于递归等操作。

顺便提一下,当你说a = bar时,你是将bar的值复制到a中。更改bar不会更改其他内存位置中的复制值。我知道数学人有时会假设等号在事实之后仍然成立,在C和Java中,双==是双向对称的。单个=被称为赋值,你可以将其视为向左的非对称箭头。在Java中,当你将一个对象设置为null时,这相当于调用析构函数的C语言等效操作。 - Jason K.
回复:“想将bar的值设置为null而不是引用null” ASCII值0字面上表示null,根据定义,它是字符串或对象的结尾(这就是我们使用null终止字符串的原因)。因此,如果内存中的值被更改为null,则它将不再是Foo对象,因为它将不具备类中定义的必要成员函数、成员变量等。 - Jason K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接