这个例子取自 Java 编程书;第 4 版。
在偶然发现这个代码示例之后,我很困惑为什么它仍然打印出对对象的新引用,即使我们声明它为“null”。理论上,我们正在更改对整个程序之间共享的对象的引用,尽管我们在 commonName 方法中将对象初始化为 null。在 commonName 的控制流点,body 构造函数中的字段被初始化为“Sirius”;当我们更改对对象的引用时(在 Java 中,您按值调用),该字段将更改为 Dog Star。方法的最后一行我们将整个对象设置为空,一旦我们打印出对象,运行时应该向我们提供空引用。
解决这个问题的唯一方法是将 commonName 方法设置为 final。任何 Java 大师都可以解释为什么会发生这种情况,尤其是在任何按值调用的语言中。
class PassRef
{
public static void main (String[] args) {
Body sirius = new Body ("Sirus", null);
System.out.println ("before: " + sirius);
commonName(sirius);
System.out.println("after: " + sirius);
}
public static void commonName (Body bodyref) {
bodyref.name = "Dog Star";
bodyref = null;
}
}
输出:
before: 0 (Sirius)
after: 0 (Dog Star)