为什么在这个例子中,按值传递有效?

时间:2012-10-06 15:51:32

标签: java overloading pass-by-value

这个例子来自Java编程书;第4版。

在遇到这个代码示例后,我很困惑,为什么它仍然打印出对象的新引用,即使我们声明它为'null'。理论上,我们正在改变对整个程序共享的对象的引用,尽管我们在commonName方法中将对象初始化为null。在commonName的控制流程点,body构造函数中的字段被初始化为“Sirius”;当我们改变对象的引用时(在Java中,你可以按值调用),该字段将更改为Dog Star。我们将整个对象设置为null的方法的最后一行,一旦我们打印出对象,运行时应该使用空引用来问候我们。

解决这个问题的唯一方法是将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)

1 个答案:

答案 0 :(得分:5)

你只是因为你不明白价值传递意味着什么而感到困惑。

常用方法不能更改传递的引用。这就是忽略null并打印新值的原因。

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