开发者社区> 问答> 正文

Java语言中,值传递和共享对象传递的现象冲突吗?

Java语言中,值传递和共享对象传递的现象冲突吗?

展开
收起
开发者小助手_LS 2021-10-21 15:27:00 496 0
1 条回答
写回答
取消 提交回答
  • 看到这里很多人可能会有一个疑问,既然共享对象传递是值传递的一个特例,那么为什么他们的现象是完全不同的呢?难道值传递过程中,如果在被调方法中改变了值,也有可能会对调用者有影响吗?那到底什么时候会影响什么时候不会影响呢?其实是不冲突的,之所以会有这种疑惑,是因为大家对于到底是什么是"改变值"有误解。

    image.png

    从上图中,可以看到,在参数传递的过程中,实际参数的地址 0X1213456 被拷贝给了形参。这个过程其实就是值传递,只不过传递的值得内容是对象的应用。那为什么我们改了 user 中的属性的值,却对原来的 user 产生了影响呢?

    其实,这个过程就好像是:你复制了一把你家里的钥匙给到你的朋友,他拿到钥匙以后,并没有在这把钥匙上做任何改动,而是通过钥匙打开了你家里的房门,进到屋里,把你家的电视给砸了。这个过程,对你手里的钥匙来说,是没有影响的,但是你的钥匙对应的房子里面的内容却是被人改动了。也就是说,Java 对象的传递,是通过复制的方式把引用关系传递了,如果我们没有改引用关系,而是找到引用的地址,把里面的内容改了,是会对调用方有影响的,因为大家指向的是同一个共享对象。

    那么,如果我们改动一下 pass 方法的内容:

    image.png

    上面的代码中,我们在 pass 方法中,重新 new 了一个 user 对象,并改变了他的值,输出结果如下:

    image.png

    再看一下整个过程中发生了什么:

    image.png

    这个过程,就好像你复制了一把钥匙给到你的朋友,你的朋友拿到你给他的钥匙之后,找个锁匠把他修改了一下,他手里的那把钥匙变成了开他家锁的钥匙。这时候,他打开自己家,就算是把房子点了,对你手里的钥匙,和你家的房子来说都是没有任何影响的。所以,Java 中的对象传递,如果是修改引用,是不会对原来的对象有任何影响的,但是如果直接修改共享对象的属性的值,是会对原来的对象有影响的。

    资料来源:《Java工程师成神之路(基础篇)》,链接:https://developer.aliyun.com/topic/download?id=923

    2021-10-21 15:52:46
    赞同 展开评论 打赏
来源圈子
更多
收录在圈子:
阿里云开发者社区官方技术圈,用户产品功能发布、用户反馈收集等。
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载