Java参数是传值还是传引用可能很多人不清楚,来看看下面的例子。
打印结果:
交换前: 李雷 韩梅梅
交换后: 李雷 韩梅梅
感觉很奇怪,为什么结果没有变化呢?
因为Java方法在执行的过程中实际上是传值。
大家知道employ_1的值实际上是Object1的地址,employ_2的值实际上为Object2的地址
在具体的执行过程中,首先会将empoly_1的值复制一份付给x,这样x就指向Object1对象了,同理,y就指向Object2对象了
在交换的过程中,实际上只是x和y进行了交换,employ_1与mploy_2实际上还是指向原来的对象,所以没有发生变化。
可能会有人会有疑惑,看如下代码:
结果如下:
更改name前: 李雷
更改name后: abc
有人觉得很奇怪,这个返回结果不就是说明,Java方法执行的时候传的是引用吗?因为最后name变了,其实不然,Java方法执行的时候仍然是传值。
因为方法执行的时候,首先会把employ_1的值拷贝一份,然后赋值给x,赋值之后employ_1和x都同时指向一个对象,对x所指向的对象进行修改,也必然会导致employ_1所指向的对象发生变化。
总结:Java复制并传递了“引用”的值,而不是对象。因此,方法中对对象的计算是会起作用的,因为引用指向了原来的对象。但是因为方法中对象的引用是“副本”,所以对象交换就没起作用。如图1所示,交换动作只对方法中的引用副本起作用了,不影响方法外的引用。所以不好意思,方法被调用后,改变不了方法外的对象的引用。如果要对方法外的对象引用做交换,我们应该交换原始的引用,而不是它的副本。