【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传递对象时采用的是引用调用,实际上并不对。
  • 对象采用的也是值调用,只不过传递的是引用值的一个拷贝,所以仍然是值调用
  • 为了更好的理解,下面有一个反例证明

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

   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被丢弃了,白费力气。
实际上,对象引用是按值传递的。

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

  • 调用方法前
    在这里插入图片描述
  • 初始化swap方法(刚进入swap方法)
    在这里插入图片描述
  • 执行方法后,方法销毁前。注意x和y对象引用的变化
    在这里插入图片描述
  • 执行方法完,方法销毁。和初始时一样,白费力气。
    在这里插入图片描述

四、总结

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值