参考《Java核心技术卷Ⅰ》
按值调用
Java所有的方法传参都是按值调用,方法得到的是所有参数值的一个拷贝。
方法参数的类型
方法参数共有两种类型
- 基本数据类型(数字、布尔值)
- 对象引用
一个内部方法不可能基本数据类型,但能通过对象引用能够修改对象的内容。
如下代码所示
public static void main(String[] args) {
Employee employee = new Employee(100);
System.out.println(employee.getSalary());
addSalary(employee);
System.out.println(employee.getSalary());
}
public static void addSalary(Employee x){
x.raiseSalary(200);
}
输出结果
解释:方法得到的是对象引用(从某种角度来说可以理解为指针,但严谨来说不是指针)的拷贝,对象引用及其他的拷贝同时引用同一个对象。
对象采用的不是引用调用!!!!
- 很多人认为Java传递对象时采用的是引用调用,实际上并不对。
- 对象采用的也是值调用,只不过传递的是引用值的一个拷贝,所以仍然是值调用
- 为了更好的理解,下面有一个反例证明
编写了一个交换两个雇员对象的方法
public static void swap(Employee x,Employee y){
Employee temp = x;
x = y;
y= temp;
}
如果Java采用的是引用调用,那么这个方法能够交互数据的效果
Employee a = new Employee("aaaa");
Employee b = new Employee("bbbb");
swap(a,b);
但方法没改变存在变量a,b中的对象引用,swap中的x和y被初始化为两个对象引用的拷贝,swap方法交换的是x,y变量中存储的引用(也可以理解为指向的对象)。最终方法结束时x和y被丢弃了,白费力气。
实际上,对象引用是按值传递的。
为了更更好理解,用图说明上面方法的调用及对象引用交换的过程
- 调用方法前
- 初始化swap方法(刚进入swap方法)
- 执行方法后,方法销毁前。注意x和y对象引用的变化
- 执行方法完,方法销毁。和初始时一样,白费力气。