JAVA中的按值调用和按引用调用
这两天一直在纠结Java的传参方式,在参考了几篇博客之后有了新的理解。
首先要知道,Java总是采用按值调用的方式,也就是说,方法会得到所有参数值得一个副本。首先先来看下面的例子
//定义一个将参数翻三倍的方法
public class Employee {
public static int tripleValue(int x){
x = 3*x;
return x;
}
}
//调用上述方法
Employee.tripleValue(percent);
输出结果为:
10
之所以没有实现参数翻三倍的功能,是因为方法中的 x 是我们所传入的参数的一个副本,该副本存储在一个新的内存空间中,和percent没有任何关系。该方法执行完之后,x便不再被使用,自然输出结果就没有发生任何改变。
因此我们知道了Java中的方法是不能修改基本数据类型的参数的。
但是如果是对象参数就不同了
//定义一个将工资翻三倍的方法
public class Employee {
private String name;
private int salary;
public Employee(String name, int salary)
{
this.name = name;
this.salary = salary;
public static void tripleValue2(Employee x){
x.RaiseSalary(200);
}
}
//调用该方法
var employee2 = new Employee("zhangsan",1000);
Employee.tripleValue2(employee2);
输出结果:
3000
因为java总是按之调用的,在给该方法传递参数时,传递的是该对象的一个副本,但是要注意,它传给方法的是什么?是该对象的内存地址。为什么是这样呢。
我们知道,构造器在每次构造对象时会构造两个对象,一个是实体对象,用于存储对象中的内容,还有一个是我们的对象变量(也就是对象名),用于存储的是实体对象的地址。现在你就会知道,原来传递给这个方法的是实体对象的内存地址,即使是创建了一个副本来传递参数给该方法,传递的内容依然是地址,因而方法能根据地址对该对象进行操作。
我个人的理解是:Java总是按值调用,但是对对象是“按引用调用”(因为传递的虽然是值,但是传递值的结果却是对实体对象的引用)
参考资料:
https://blog.youkuaiyun.com/gaozhuang63/article/details/108618055