0

这个例子取自 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)
4

1 回答 1

5

您之所以感到困惑,只是因为您不了解按值传递的含义。

通用方法不能更改它传递的引用。这就是为什么 null 被忽略并打印新值的原因。

您可以更改传递的引用指向的对象的状态,但不能更改引用本身的值。

于 2012-10-06T15:53:42.527 回答