题目
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 不再使用。
>
> 
>
> 已经看到,一个方法不可能修改一个基本数据类型的参数。而对象引用作为参数就不同了,可以很容易地修改对象的字段值(比如我们有个 `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 的对象。
>
> 
