天真,居然还有人认为java的参数传递方式是引用传递( 三 )

我们发现主函数中剑圣的属性变回了刺客,并没有受到dosomthing函数的影响,如果是引用传递的话,主函数中剑圣的职业应该是战士而不是刺客 。这是为什么呢?为什么是应用传递主函数中剑圣的职业应该是战士呢?
下面我们一起来分析一波
我们假设对象的传递方式为引用传递

天真,居然还有人认为java的参数传递方式是引用传递

文章插图
 
这是堆栈中的信息,当我们将对象lolVo传递给dosomthing的时候,是克隆了一个对象出来还是原来的那个对象呢?我们知道,不管传递的是不是它本身,值都是内存的地址引用,我们现在先假设主函数没有复制,是直接将lolVo传递给了dosomthing,那图形应该是什么样的呢?
天真,居然还有人认为java的参数传递方式是引用传递

文章插图
 
如果是引用传递,格式是不是应该是这样呢?main主函数和dosomthing函数共用一个lolVo,这个时候我们在dosomthing函数中执行了一句:lolVo = new LolVo();那又会变成什么样呢?
天真,居然还有人认为java的参数传递方式是引用传递

文章插图
 
在dosomthing方法中我们new了一个新的LolVo对象,并且将这个新的对象赋值给了lolVo,那是不是代表着main主函数核dosomthing函数中的lolVo应该是一样的呢,我们再来回顾一下上面的代码
private static void dosomthing(LolVo lolVo) {lolVo = new LolVo();lolVo.setProfession("战士");System.out.println("dosomthing lolVo = "+lolVo);}123456我们做了修改之后,主函数剑圣的职业并没有修改成战士,所以,说java是引用传递是说不通的,那我们再来看看它正确的流程应该是什么样的呢?
天真,居然还有人认为java的参数传递方式是引用传递

文章插图
 
尽管dosomthing对参数的修改会影响调用方,但是它还是属于值传递,会影响调用方是因为java转递的时候拷贝的是对象的引用地址 。
举个栗子:比如某公司开发了一套员工的内部管理系统,有一个管理员的账号,你把这个账号给了你的同事,他直接使用你这个账号,这就是引用传递,如果你是在用户管理中添加了一条管理员的用户,再将这个账号给你的同事,这就是值传递,还需要解释一下,为什么值传递会影响调用方,如果你给的账号,你同事改了用户名称,这对你是不是没有影响,但如果他手抖把员工全删了,你这边还能看到员工信息吗?就是这个道理,lolVo引用地址相当于管理员账号,系统内的功能相当于LolVo对象,你修改自己的账号对别人当然没有影响,但是你把系统搞没了,你觉得有影响吗?这就是为什么java的参数传递方式为值传递却能影响调用方 。
总结如果还有人和你说java的参数传递是引用传递的话,请他来看一下我这篇博客,我把他劝退一下 。




推荐阅读