发过贴子后才发现大家已经讨论过这个问题,因为我没学过C++,所以大家拿C++与JAVA比较结果作解释我还不是十分明白。
core java 上对传值调用的解释是“方法得到的是调用者的值”;而传引用调用则是“方法得到的是调用者提供的变量地址”。
依据这个解释,如果java可以实现“传引用调用”,即可以改变调用参数的地址?那第三个方法(swap)的结果应该是
Testing swap:
Before: a =Alice
Before: b =Bob
End of method: x=Bob
End of method: y=Alice
After: a =Bob
After: b =Alice
但实际上并不是这个结果。那么,是否可以说明java是“传值调用”?
可是,对于第二个方法(tripleSalary),core java 的解释是:方法得到的是对象引用(参数?)的一个拷贝,与原来对象变量指向同一个对象。那么这不是“传递地址”的意思么?那么不是“传引用调用”了?
我是越来越糊涂了。

解决方案 »

  1.   

    可以这么说,引用传递第一步还是值传递,只不过复制的是指对象的地址,第二个方法tripleSalary(harry),是直接对传入引用指向的对象进行操作,所以对象的值改变了
    而第三个方法swap(a,b),直接交换的是传入引用指向的地址,还是相当于值传递。
      

  2.   

    re fgump(懒人)
    >可以这么说,引用传递第一步还是值传递,只不过复制的是指对象的地址,第二个方法>tripleSalary(harry),是直接对传入引用指向的对象进行操作,所以对象的值改变了
    >而第三个方法swap(a,b),直接交换的是传入引用指向的地址,还是相当于值传递。“引用传递第一步还是值传递…”的解释是否是指第二个方法用的就是“传引用调用”?
    “而第三个方法swap(a,b)…”,那么x=y是否表示更改了对象变量x的指向地址?但实际上的结果并没有改变,这又如何解释呢?
      

  3.   

    →   表示对象句柄,实际大小为4个字节
    █   表示堆中的对象,大小于具体的对象有关
    在第二个函数, 前
    harry→       █0xffff                (假设的内存地址)
    你把harry传给了函数,函数用x接受
    x = harry
    则此时有
    harry→       █0xffff
    x→          █0xffff函数所做的操作是
    把  █0xffff  这个对象的内容改变,其结果是harry和x所指向的内容都变化了
    在第三个函数,前
    a→         █0xf000
    b→         █0xf00a你把a,b传给了函数,函数用x,y接受
    现在
    a→         █0xf000
    x→         █0xf000b→         █0xf00a
    y→         █0xf00a
    函数调用时
    temp = x;
    x = y;
    y = temp;
    结果在函数体里
    y→         █0xf000
    x→         █0xf00a
        xy指向的内容发生了互换,但外部的ab,没有受到影响
    函数调用完成后
    a→         █0xf000
    b→         █0xf00a
        没有任何变化.
    I don't know whether you will understand me .
    But I have tried my best.
      

  4.   

    re oneonone(阳光总在风雨后) thanks a lot , i think i caught some idea about that .then, however, basing upon your explains, java is call by reference? not by value?
      

  5.   

    而第三个方法swap(a,b),是把a,b指向的对象的地址作为实参进行值传递。这样就像swap(int a,int b)的机制一样了,出了swap方法,a,b指向的地址并没有交换。
      

  6.   

    第三个方法:
    public static void  swap(Employee x, Employee y)
    {
    Employee temp = x;
    x = y;
    y = temp;
    System.out.println("End of method: x=" + x.getName());
    System.out.println("End of method: y=" + y.getName());
    }进入这个方法中的x和y变量,只是调用时swap(a,b),a和b变量的一个拷贝,方法要结束时变的只是x和y的变量值,方法一结束,它们就被抛弃了。对a和b没有影响。
      

  7.   

    如第一个函数所显示的,java对于简单类型(如int)进行传值调用,
    而对于对象只有传引用调用.