#Java#我要彻底给你讲清楚,Java就是值传递,不接受争辩的那种!( 四 )


我们先回到上面的例子中来 , 看一下调用过程中实际上发生了什么?
在参数传递的过程中 , 实际参数的地址0X1213456被拷贝给了形参 。 这个过程其实就是值传递 , 只不过传递的值得内容是对象的应用 。
那为什么我们改了user中的属性的值 , 却对原来的user产生了影响呢?
其实 , 这个过程就好像是:你复制了一把你家里的钥匙给到你的朋友 , 他拿到钥匙以后 , 并没有在这把钥匙上做任何改动 , 而是通过钥匙打开了你家里的房门 , 进到屋里 , 把你家的电视给砸了 。
这个过程 , 对你手里的钥匙来说 , 是没有影响的 , 但是你的钥匙对应的房子里面的内容却是被人改动了 。
也就是说 , Java对象的传递 , 是通过复制的方式把引用关系传递了 , 如果我们没有改引用关系 , 而是找到引用的地址 , 把里面的内容改了 , 是会对调用方有影响的 , 因为大家指向的是同一个共享对象 。
那么 , 如果我们改动一下pass方法的内容:
public void pass(User user) {
   user = new User();
   user.setName(\"hollischuang\");
   System.out.println(\"print in passuser is \" + user);

上面的代码中 , 我们在pass方法中 , 重新new了一个user对象 , 并改变了他的值 , 输出结果如下:
print in passuser is User{name='hollischuang' gender='Male'
print in mainuser is User{name='Hollis' gender='Male'

再看一下整个过程中发生了什么:
这个过程 , 就好像你复制了一把钥匙给到你的朋友 , 你的朋友拿到你给他的钥匙之后 , 找个锁匠把他修改了一下 , 他手里的那把钥匙变成了开他家锁的钥匙 。 这时候 , 他打开自己家 , 就算是把房子点了 , 对你手里的钥匙 , 和你家的房子来说都是没有任何影响的 。
所以 , Java中的对象传递 , 如果是修改引用 , 是不会对原来的对象有任何影响的 , 但是如果直接修改共享对象的属性的值 , 是会对原来的对象有影响的 。
总结我们知道 , 编程语言中需要进行方法间的参数传递 , 这个传递的策略叫做求值策略 。
在程序设计中 , 求值策略有很多种 , 比较常见的就是值传递和引用传递 。 还有一种值传递的特例——共享对象传递 。
值传递和引用传递最大的区别是传递的过程中有没有复制出一个副本来 , 如果是传递副本 , 那就是值传递 , 否则就是引用传递 。
在Java中 , 其实是通过值传递实现的参数传递 , 只不过对于Java对象的传递 , 传递的内容是对象的引用 。
我们可以总结说 , Java中的求值策略是共享对象传递 , 这是完全正确的 。
但是 , 为了让大家都能理解你说的 , 我们说Java中只有值传递 , 只不过传递的内容是对象的引用 。 这也是没毛病的 。
但是 , 绝对不能认为Java中有引用传递 。
OK , 以上就是本文的全部内容 , 不知道本文是否帮助你解开了你心中一直以来的疑惑 。 欢迎留言说一下你的想法 。

最新整理的Java技术干货文档资料:【Java核心知识点整理】涵盖29个Java核心技术详解 , JVM , Redis , Nginx , Spring Boot , Spring Cloud , Kafka , 并发编程 , Tomcat , MyBatis , BAT面试题 , Java技术精讲视频等 。 转发+关注 , 私信回复“干货”即可获得免费领取方式 。
掌握了这些知识点 , 面试时在候选人中又可以夺目不少 , 暴击9999点 。 机会都是留给有准备的人 , 只有充足的准备 , 才可能让自己可以在候选人中脱颖而出 。


推荐阅读