java是按值调用而不是按引用调用
1、方法不能修改基本数据类型的参数。
2、方法可以改变对象参数的状态
3、方法不能让一个对象参数引用另一个新对象。
public static void tripleSalary(double x){
x = 3*x;
}
//调用
double percent = 10;
tripleValue(percent);
上述代码执行完并不会改变percent的值,因为在执行tripleSalary方法时,x实际上是percent的一个副本。方法执行完相当于只改变了副本的值,和原来的percent没有关系。
但是下面代码是可以改变值的
public static void tripleSalary(Employee x){
x.raiseSalary(200);
}
//调用
Employee harry = new Employee(10);
tripleSalary(harry);
之所以能够改变harry的属性值,是因为x是harry的一个副本,他们两个同时引用同一地址,当执行额raiseSalary(200)方法时,实际上是改变了引用的那个地址里的值,因此harry的属性的值也顺理成章的被改变了。
但是有一点要注意,即便是x是harry副本也不能说是harry将引用传给了x,正确来说是harry将引用的地址作为值,传递给了x。如果是按引用调用,下面的代码应该可以交换两者的值。
public static void swap(Employee x,Employee y){
Employee temp = x;
x = y;
y = temp;
}
//调用
var a = new Employee("ALICE");
var b = new Employee("BOB");
swap(a,b);
实际上,上述代码并不能交换a和b的值,因为方法中的
x和y分别是a和b的副本,方法只是交换了两个副本指向的地址,而没有影响到a和b。
因此,我们可以说,java是按值调用的。