当初学习时一个概念也是感到很绕,真正工作反而成了肌肉记忆,其实理论知识在工作中也许会有习惯替代,但是当面对问题时,理论才会重要。
值调用–call by value 表示方法接收的是调用者提供的值。
引用调用–call by reference 表示方法接收的是调用者提供的变量地址。
一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。
绕还是不饶,其实工作用来用去也就不纠结了,一个是因为经验,一个因为可以调试。
Java程序设计语言总是采用值调用。
也就是说,方法得到的是所有参数值得一个copy,特别是方法不能修改传递给它的任何参数变量的内容。
double a =2.5;
staff.raiseSalary(a);
System.out.println(a);
内存图不用画了,很简单a copy了一份让方法去加工,a没变。
java数据类型有两种:基本数据类型和对象引用。
public static void tripleSalary( Employee staff){
staff.raiseSalary(200);
}
// 构造三个真实员工
Employee staff= new Employee("孙悟空", 25000.00, 2019, 10, 22);
EmployeeTest.tripleSalary(staff);
System.out.println(staff.getSalary());
扔个对象进去,加工了下,staff的工资翻了三倍。
这个也是值传递,但是变量中的值是对象地址。
相当于方法中的参数变量,和staff指向同一个对象,对象被加工了,staff也指向的对象当然变了。
但是staff的值还是没有变,他存的还是指向原来对象的地址。
地址传递在c++用的是如火如荼,但是在java中一直被误解。
来个好玩的反例,理解下方法参数一直传递的是copy值。
public static void exchange( Employee A,Employee B){
Employee tmp =A;
A =B;
B =A;
}
public static void main(String[] args) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
// 构造三个真实员工
Employee A= new Employee("孙悟空", 25000.00, 2019, 10, 22);
Employee B= new Employee("猪八戒", 25000.00, 2019, 10, 22);
EmployeeTest.exchange(A,B);
System.out.println(A.getName());
System.out.println(B.getName());
}
打印结果
孙悟空
猪八戒
Process finished with exit code 0
顺序并没有变,方法内部打印肯定变了。
这么copy确保了数据安全,但是影不影响性能哪?尤其是多层级嵌套对象。