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()一样赋值一遍?

解决方案 »

  1.   

    只能遍历A类的所有字段。而且还有风险,如果有什么private属性且没有暴露出来的话。最好是在A类中写个函数,比如:
    public void copyFrom(A other) {
      // ....
    }程序中就:
    a.copyFrom(updateA(a));
      

  2.   

    你这段代码中的
    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了。
      

  3.   

    回复3楼:
    是这样的,a = updateA(a)其实我这是调用一个remote ejb方法,
    假设是 a = myRemoteEjb.updateA(a);
    好像远程EJB方法执行时,并不会对客户端所传参数进行回传,即没有传址的概念,不知道我说的对不对。
      

  4.   

    问题还是出在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()对象的属性,其他引用变量都能反映其中的变化