发过贴子后才发现大家已经讨论过这个问题,因为我没学过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 的解释是:方法得到的是对象引用(参数?)的一个拷贝,与原来对象变量指向同一个对象。那么这不是“传递地址”的意思么?那么不是“传引用调用”了?
我是越来越糊涂了。
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 的解释是:方法得到的是对象引用(参数?)的一个拷贝,与原来对象变量指向同一个对象。那么这不是“传递地址”的意思么?那么不是“传引用调用”了?
我是越来越糊涂了。
解决方案 »
- JDK 从1.6.0_13 升级到1.6.0_31后Java 程序菜单显示的变化, 求解
- 如何执行完一句语句后停止100ms
- 问一个Number基础类的问题
- 新手问题求解:Java中this关键字的含义及用法
- dialog怎么样设置alt+tab的时候出现的图标
- 关于classpath的设置问题
- 请教:我如何在JBuilder中执行Applet小程序?(等待中...)
- 新手提问:怎样开发Java的b/s模式的系统?
- 请问高手,如何配应用服务器Weblogic?
- ObjectOutputStream 乱码
- 哪位高手可以详细的分析一下位运算符啊?!
- 谁能提供我java 打印(纯java代码)的源程序?
而第三个方法swap(a,b),直接交换的是传入引用指向的地址,还是相当于值传递。
>可以这么说,引用传递第一步还是值传递,只不过复制的是指对象的地址,第二个方法>tripleSalary(harry),是直接对传入引用指向的对象进行操作,所以对象的值改变了
>而第三个方法swap(a,b),直接交换的是传入引用指向的地址,还是相当于值传递。“引用传递第一步还是值传递…”的解释是否是指第二个方法用的就是“传引用调用”?
“而第三个方法swap(a,b)…”,那么x=y是否表示更改了对象变量x的指向地址?但实际上的结果并没有改变,这又如何解释呢?
█ 表示堆中的对象,大小于具体的对象有关
在第二个函数, 前
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.
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没有影响。
而对于对象只有传引用调用.