先说结论:按值调用!!!
原谅我不愿意再次解说,实在是原文写的太好了,直接上原文:
具体来说,如何体现呢?
《Java核心技术卷Ⅰ》里告诫我们:有些程序员(甚至本书的作者)认为 Java 程序设计语言对对象采用的是引用调用, 实际上, 这种理解是不对的。
由于这种误解具有一定的普遍性,所以下面给出一个反例来详 细地阐述一下这个问题。
首先,编写一个交换两个雇员对象的方法:
public static void swap(Employee x , Employee y) // doesn't work
{
Employee temp = x;
x = y;
y = temp;
}
如果
Java
对对象采用的是按引用调用
,
那么这个方法就应该能够实现交换数据的效果
:
Employee a = new Employee("Alice", . . .);
Employee b = new Employee("Bob", . . .);
swap(a, b);
// does a now refer to Bob, b to Alice?
但是
,
方法并没有改变存储在变量
a
和
b
中的对象引用
。
swap
方法的参数
x
和
y
被初始化为两个对象引用的拷贝,
这个方法交换的是这两个拷贝
。
// x refers to Alice, y to Bob
Employee temp = x;
x = y;
y = temp;
// now x refers to Bob, y to Alice
最终
,
白费力气
。
在方法结束时参数变量 x
和
y
被丢弃了
。
原来的变量
a
和
b 仍然引用这个方法调用之前所引用的对象。
这个过程说明
:
Java
程序设计语言对对象采用的不是引用调用
,
实际上
,
对象引用是
按值传递
的。
下面总结一下
Java
中方法参数的使用情况
:
- 一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)。
- 一个方法可以改变一个对象参数的状态。
- 一个方法不能让对象参数引用一个新的对象。