方法参数传递的两种方式:
- 按值调用:表示方法接收调用者提供的值
- 按引用调用:表示方法接收调用者提供的变量地址
首先声明:**Java程序设计语言总是采用按值调用**,即方法得到的是所有参数值的拷贝。
所以如下程序代码不会修改变量a的值
```java
int a = 3;
xxx.add(a); // 假设add方法内存在a=a+1这样的代码
// 输出a,结果还是3
```
[![](https://www.kdphoto.cn/pic/a465936fcf257c6df45df523f1069206)](https://www.kdphoto.cn/pic/a465936fcf257c6df45df523f1069206?p=0)
以上是基本类型的情况。如果使用对象引用,则会不同
[![](https://www.kdphoto.cn/pic/86a619dfba16cc8a0ee5f7fdcbbd098b)](https://www.kdphoto.cn/pic/86a619dfba16cc8a0ee5f7fdcbbd098b?p=0)
[![](https://www.kdphoto.cn/pic/a3e4b0d29ebc55fac5b31bd13210ace9)](https://www.kdphoto.cn/pic/a3e4b0d29ebc55fac5b31bd13210ace9?p=0)
因此,Java中方法参数是一个值拷贝,对于基本类型,在方法内修改参数,方法外是不可见的(他们是两个不同的变量)。对于对象引用作为参数,方法得到的是对象引用的拷贝,他们指向的是相同的地址,所以修改对象的状态时,方法外部可以观测到。
用一个反例证明Java不是按引用调用
```java
public static void swap(Employee a,Employee b){
Employee temp = a;
a=b;
b=temp;
}
```
当测试该方法后,能够发现Employee并没有被交换