【Java】理解java传参总是采用值传递/按值调用

参考《Java核心技术卷Ⅰ》

按值调用

Java所有的方法传参都是按值调用,方法得到的是所有参数值的一个拷贝

方法参数的类型

方法参数共有两种类型

  • 基本数据类型(数字、布尔值)
  • 对象引用

一个内部方法不可能基本数据类型,但能通过对象引用能够修改对象的内容。
如下代码所示

  public static void main(String[] args) {
      Employee employee = new Employee(100);
      System.out.println(employee.getSalary());
      addSalary(employee);
      System.out.println(employee.getSalary());
  }

  public static void addSalary(Employee x){
      x.raiseSalary(200);
  }

输出结果

【Java】理解java传参总是采用值传递/按值调用_第1张图片
解释:方法得到的是对象引用(从某种角度来说可以理解为指针,但严谨来说不是指针)的拷贝,对象引用及其他的拷贝同时引用同一个对象。

对象采用的不是引用调用!!!!

  • 很多人认为Java传递对象时采用的是引用调用,实际上并不对。
  • 对象采用的也是值调用,只不过传递的是引用值的一个拷贝,所以仍然是值调用
  • 为了更好的理解,下面有一个反例证明

编写了一个交换两个雇员对象的方法

   public static void swap(Employee x,Employee y){
       Employee temp = x;
       x = y;
       y= temp;
   }

如果Java采用的是引用调用,那么这个方法能够交互数据的效果

  Employee a = new Employee("aaaa");
  Employee b = new Employee("bbbb");
  swap(a,b);

但方法没改变存在变量a,b中的对象引用,swap中的x和y被初始化为两个对象引用的拷贝,swap方法交换的是x,y变量中存储的引用(也可以理解为指向的对象)。最终方法结束时x和y被丢弃了,白费力气。
实际上,对象引用是按值传递的。

为了更更好理解,用图说明上面方法的调用及对象引用交换的过程

  • 调用方法前
    【Java】理解java传参总是采用值传递/按值调用_第2张图片
  • 初始化swap方法(刚进入swap方法)
    【Java】理解java传参总是采用值传递/按值调用_第3张图片
  • 执行方法后,方法销毁前。注意x和y对象引用的变化
    【Java】理解java传参总是采用值传递/按值调用_第4张图片
  • 执行方法完,方法销毁。和初始时一样,白费力气。
    【Java】理解java传参总是采用值传递/按值调用_第5张图片

总结

在这里插入图片描述

你可能感兴趣的:(JAVA基础,java,python,开发语言)