日期:2014-05-17  浏览次数:20660 次

传址参数被重新new()后如何返回?
Java code
public int changeA(A a){
  a.time = new Date();
  a = updateA(a);
  retrun 1;
}

A o = new A();
int iReturn = changeA(o);
//此时o.time=null,而不是当前时间


如果保留changeA()方法的int返回值,怎么让updateA()过后的a对象反传给外层的o实例?
用clone(),还是遍历A类的所有字段像setTime()一样赋值一遍?

------解决方案--------------------
只能遍历A类的所有字段。而且还有风险,如果有什么private属性且没有暴露出来的话。

最好是在A类中写个函数,比如:
public void copyFrom(A other) {
// ....
}

程序中就:
a.copyFrom(updateA(a));
------解决方案--------------------
你这段代码中的
a = updateA(a);
丝毫没有意义啊。因为a在这个函数中是一个局部变量。你的代码和

public int changeA(A a){
a.time = new Date();
updateA(a);
retrun 1;
}

是完全等效的。只有对A内部的成员的变动才会有用。所以你的o.time=null是因为在updateA中对a.time进行了修改。让他变成null了。
------解决方案--------------------
问题还是出在updateA方法里面
public int changeA(A a){
a.time = new Date();
//a = updateA(a); //暂时忽略这个方法来讨论,外层的o的time是和a的time一致的,因为a和o指向同一个对象,修改其中一个引用的属性影响另一个引用
retrun 1;
}
所以问题出现在updateA里面,估计里面重新修改了a.time让它指向null了

java里虽然没有传址的概念(其实引用传递就相当于C的传址),但是修改引用的属性能够影响方法外另一个引用变量的(注意是修改属性而不是改变引用变量的指向),所以updateA方法里,修改了a的属性,比如把a.time改成了null,那么updateA方法外的a也受到影响,同样的changeA方法外的o也受到影响,因为
o指向对象new A()
changeA的a指向和o相同的对象new A()
updateA的a指向和changeA的a相同的对象new A()
所以,不管用哪个引用变量改变new A()对象的属性,其他引用变量都能反映其中的变化