这个例子来自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)
答案 0 :(得分:5)
你只是因为你不明白价值传递意味着什么而感到困惑。
常用方法不能更改传递的引用。这就是忽略null并打印新值的原因。
您可以更改传递的引用所指向的对象的状态,但不能更改引用本身的值。