2021/03/21Java中向方法中传入参数时遇到的问题

引入

我们的目的是为了让数组中的元素内容交换,下面为代码图1,是我第一次写的代码

代码图1

在这里插入图片描述

  • 我们定义的exchange方法参数列表为形参a和形参b
  • 这个程序的结果还是 2 1,也就是数组中元素的内容没有发生改变。
  • 为什么呢?我们不是将两个数组元素的值传入了吗?
  • 下面请看内存图1

内存图1

在这里插入图片描述

  • 图解:由于我们在调用exchange方法的时候,没有数组的地址,即便发生了数据交换,也不会对原数组产生影响。
  • 下面就要说我们的代码图2了

代码图2

在这里插入图片描述

  • 代码图2和代码图1有什么区别呢?
  • 主要区别就是在exchange方法的参数列表不同
  • 代码图1中的exchange方法参数列表是形参a和形参b
  • 代码图2中的exchange方法参数列表不仅有形参a和形参b,我们还多了一个形参数组
  • 这样我们在使用exchange方法的时候,就可以直接改变数组中的内容了
  • 这次程序的运行结果就是1 2了
  • 请看内存图2

内存图2

在这里插入图片描述
我们在调用exchange方法的时候,地址就可以指向堆中存放的数组了。

拓展

  • 首先,我们先引入两个概念,值传递和引用传递
  • 值传递:向方法中传入实参,实参拷贝交给形参,无论形参怎么改变这个拷贝过来的实参,都不会对实参产生影响
  • 引用传递:向方法中传入实参,实参直接交给形参,形参做出改变,实参会受到相应的影响。
  • 我们上面的代码图1和代码图2是值传递还是引用传递呢?
  • 有人认为,代码图1是值传递,代码图2是引用传递。因为代码1中传入的参数全是数值,代码图2中传入的参数有数值有地址。
  • 这种想法是错误的。
  • Java中是没有引用传递的,全部都是值传递
  • 代码图1没有地址,无法对数组中的元素产生影响。实参是索引值0和1,我们使用完这两个实参后,两个实参并没有改变,还是0和1
  • 代码图2有地址了,可以通过这个地址对数组的元素产生影响。实参是数组地址值,索引值0和1,我们使用完这三个实参后,三个实参没有改变,数组地址还是数组的地址,索引值还是0和1。
  • Java使用了特殊的办法,达成了和引用传递一样的效果,但不会对实参产生影响,这种传递我们称之为共享传递。共享传递是值传递的一个特例。
  • 下面让我们介绍第3种情况,请看代码图3和代码图4

代码图3User类 和 代码图4测试类

代码图3 User类

在这里插入图片描述

代码图4 测试类

在这里插入图片描述

程序运行结果

在这里插入图片描述

  • 为什么是这个结果呢?我们传入了一个user对象的地址值进去,按说main方法中的打印输出应该会受到method方法的影响,两次结果都应该是"method方法"才对。可为什么和我们预想的结果不一样呢?
  • 我们来解释一下这个问题,请看内存图3

内存图3

在这里插入图片描述

  • 备注:我们在调用方法method的时候,方法体中new新建了一个user对象。因此method方法和main方法指向的user对象并不是同一个
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香鱼嫩虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值