浅析Java中按值传递

欢迎跳转到本文原文链接 Backend_Notes


首先回顾一下程序设计语言中有关将参数按值传递给方法(或函数)的一些专业术语。按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call by reference)标识方法接收的是调用者提供的变量地址一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用对应的变量值。

Java 程序设计语言总是采用按值调用,也就是说,方法得到的是所以参数值的一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容。

方法参数有两种数据类型: 基本数据类型和引用类型

基本数据类型

public void tripleValue(double x) {
     
    x = x * 3; // 30
}
double percent = 10;
tripleValue(percent); // 10

观察上述代码可知,由于 Java 按值传递,因此 tripleValue 中的 x 只是 percent 的拷贝,它的变化是独立于 percent 的, 所以不能更改 percent 的值。

引用类型

public void tripleValue(Employee x) {
     
    x.salary = x.salary * 3; // 30
}
Employee harry = new Employee();
tripleValue(harry); // 10

观察上述代码,具体执行步骤如下:

  • x 被初始化为 harry 的值的拷贝
  • x 与 harry 共同引用的对象的 salary 变为原来的3倍
  • 方法结束后,x参数不再使用

这里需要注意:Java 程序设计语言对对象采用的是值调用,而不是引用调用。

public void swap(Employee a, Employee b) {
     
    Employee temp = a;
    a = b;
    b = temp;
}
Employee x = new Employee();
Employee y = new Employee();
swap(x, y);

上述代码运行结束后,并没有改变 存储在x, y 中的对象引用,因为 swap 方法交换的仅仅是 x, y 的值的拷贝。

结论

总结一下 Java 中方法参数的使用情况:

  • 一个方法不能修改一个基本数据类型的参数。
  • 一个方法可以改变一个对象参数的状态
  • 一个方法不能让对象参数引用一个新的对象。

Reference

  1. Java核心技术卷一

你可能感兴趣的:(Java,java)