Lew*_*ins 0 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;
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
before: 0 (Sirius)
after: 0 (Dog Star)
Run Code Online (Sandbox Code Playgroud)
你只是因为你不明白价值传递意味着什么而感到困惑.
常用方法不能改变它传递的引用.这就是忽略null并打印新值的原因.
您可以更改传递的引用指向的对象的状态,但不能更改引用本身的值.
| 归档时间: |
|
| 查看次数: |
148 次 |
| 最近记录: |