引入
我们的目的是为了让数组中的元素内容交换,下面为代码图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对象并不是同一个