题目
Java 是按值调用还是按引用调用?
答案
- **按值调用 (call by value )** 表示方法接收的是调用者提供的值。 - **按引用调用 ( call by reference )** 表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。 **Java 程序设计语言总是采用「按值调用」。也就是说,方法得到的是所有参数值的一个拷贝,方法不能修改传递给它的任何参数变量的内容。** 在 Java 中,方法参数共有两种类型: - 基本数据类型:一个方法【不能】修改一个基本数据类型的参数 - 引用数据类型:一个方法【可以】改变一个引用数据类型的参数 > 举个例子,假定一个方法试图将一个参数值增加至 3 倍: > > ```java > public static void tripleValue(double x){ > x *= 3; > } > -------------------------- > double percent = 10; > tripleValue(percent); > ``` > > <u>调用这个方法之后,`percent` 的值还是 10</u>。下面看一下具体的执行过程: > > - x 被初始化为 `percent ` 值的一个拷贝(也就 是 10 ) > - x 被乘以 3 后等于 30。 但是 `percent `仍然是 10 > - 这个方法结束之后,参数变量 x 不再使用。 > > ![](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/img/20200618152649.png) > > 已经看到,一个方法不可能修改一个基本数据类型的参数。而对象引用作为参数就不同了,可以很容易地修改对象的字段值(比如我们有个 `Employee` 类,其中有字段 `salary`和 方法 `raiseSalary` ): > > ```java > class Employee { > private salary; > ...... > public void raiseSalary { > salary += 200; > } > } > > ----------------------- > > public static void tripleSalary (Employee x) { > x.raiseSalary(200); > } > > ----------------------- > > harry = new Emplyee(...); > tipleSalary(harry); > ``` > > 具体的执行过程为: > > - x 被初始化为 `harry `值的拷贝,这里是一个对象的引用。 > - `raiseSalary `方法应用于这个对象引用。x 和 `harry `同时引用的那个 `Employee `对象的薪金提高了 200。 > - 方法结束后,参数变量 x 不再使用。当然,对象变量 `harry `继续引用那个薪金增加 200 的对象。 > > ![](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/img/20200618153148.png)