欢迎跳转到本文原文链接 Backend_Notes
首先回顾一下程序设计语言中有关将参数按值传递给方法(或函数)的一些专业术语。按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call by reference)标识方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用对应的变量值。
Java 程序设计语言总是采用按值调用,也就是说,方法得到的是所以参数值的一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容。
方法参数有两种数据类型: 基本数据类型和引用类型
基本数据类型
public void tripleValue(double x) {
x = x * 3; // 30
}
double percent = 10;
tripleValue(percent); // 10
观察上述代码可知,由于 Java 按值传递,因此 tripleValue 中的 x 只是 percent 的拷贝,它的变化是独立于 percent 的, 所以不能更改 percent 的值。
引用类型
public void tripleValue(Employee x) {
x.salary = x.salary * 3; // 30
}
Employee harry = new Employee();
tripleValue(harry); // 10
观察上述代码,具体执行步骤如下:
- x 被初始化为 harry 的值的拷贝
- x 与 harry 共同引用的对象的 salary 变为原来的3倍
- 方法结束后,x参数不再使用
这里需要注意:Java 程序设计语言对对象采用的是值调用,而不是引用调用。
public void swap(Employee a, Employee b) {
Employee temp = a;
a = b;
b = temp;
}
Employee x = new Employee();
Employee y = new Employee();
swap(x, y);
上述代码运行结束后,并没有改变 存储在x, y 中的对象引用,因为 swap 方法交换的仅仅是 x, y 的值的拷贝。
结论
总结一下 Java 中方法参数的使用情况:
- 一个方法不能修改一个基本数据类型的参数。
- 一个方法可以改变一个对象参数的状态
- 一个方法不能让对象参数引用一个新的对象。
Reference
- Java核心技术卷一