Java是传值还是传引用问题

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所示,交换动作只对方法中的引用副本起作用了,不影响方法外的引用。所以不好意思,方法被调用后,改变不了方法外的对象的引用。如果要对方法外的对象引用做交换,我们应该交换原始的引用,而不是它的副本。








评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值