一些术语的解释
- 按值调用:表示方法接收的是调用者提供的值。即方法的得到的是变量的一份拷贝,而非原本的变量。
- 按引用调用:表示方法接收的是调用者提供的变量地址。方法的得到的是原本的变量的引用。
一个方法可以修改 按引用调用 传入的变量值,而不可以修改 按值调用 传入的变量值。
在java中,总是 按值调用,即方法得到的总是所有参数值的一个拷贝,无法修改原本变量的内容。
所以,在java中,一个方法不可能修改一个基本数据类型的参数。但是将对象作为参数就可以实现这一操作。
例如:
对一个基本数据类型的变量进行操作:
public static void tripleValue(int a){
a = a * 3;
}
int a = 10;
tripleValue(a);
并不会改变a的值。内存示意图如下:
变量被进行了复制操作。
而对对象进行操作就不同了:
public static void tripleValue(NumContent a){
a.tripleIt();
}
a = new NumContent();
tripleValue(a);
内存模型如下:
可以看到,这里被复制的是对象的引用,但是仍旧指向原本的内存地址。
然而,这并不意味着java对于对象采用的是 按引用调用。下面是一个反例:
public static void swap(Employee x, Employee y){
Employee temp = x;
x = y;
y = temp;
}
Employee a = new Employee("Alice");
Employee b = new Employee("Bob");
swap(a,b);
//执行完成后,a仍旧为Alice,b为Bob
方法并没有改变存储在变量a和b中的对象引用。swap交换的是两个对象的引用的拷贝。而执行完毕后两个拷贝x和y被直接丢弃,a和b仍旧指向原本的内存空间。
内存模型如下:
这说明,对象引用是 按值传递 的。
java中方法参数使用情况总结
- 一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)。
- 一个方法可以改变一个对象参数的状态。
- 一个方法不能让对象参数引用一个新的对象。