我们发现主函数中剑圣的属性变回了刺客,并没有受到dosomthing函数的影响,如果是引用传递的话,主函数中剑圣的职业应该是战士而不是刺客 。这是为什么呢?为什么是应用传递主函数中剑圣的职业应该是战士呢?
下面我们一起来分析一波
我们假设对象的传递方式为引用传递
文章插图
这是堆栈中的信息,当我们将对象lolVo传递给dosomthing的时候,是克隆了一个对象出来还是原来的那个对象呢?我们知道,不管传递的是不是它本身,值都是内存的地址引用,我们现在先假设主函数没有复制,是直接将lolVo传递给了dosomthing,那图形应该是什么样的呢?
文章插图
如果是引用传递,格式是不是应该是这样呢?main主函数和dosomthing函数共用一个lolVo,这个时候我们在dosomthing函数中执行了一句:lolVo = new LolVo();那又会变成什么样呢?
文章插图
在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是引用传递是说不通的,那我们再来看看它正确的流程应该是什么样的呢?文章插图
尽管dosomthing对参数的修改会影响调用方,但是它还是属于值传递,会影响调用方是因为java转递的时候拷贝的是对象的引用地址 。
举个栗子:比如某公司开发了一套员工的内部管理系统,有一个管理员的账号,你把这个账号给了你的同事,他直接使用你这个账号,这就是引用传递,如果你是在用户管理中添加了一条管理员的用户,再将这个账号给你的同事,这就是值传递,还需要解释一下,为什么值传递会影响调用方,如果你给的账号,你同事改了用户名称,这对你是不是没有影响,但如果他手抖把员工全删了,你这边还能看到员工信息吗?就是这个道理,lolVo引用地址相当于管理员账号,系统内的功能相当于LolVo对象,你修改自己的账号对别人当然没有影响,但是你把系统搞没了,你觉得有影响吗?这就是为什么java的参数传递方式为值传递却能影响调用方 。
总结如果还有人和你说java的参数传递是引用传递的话,请他来看一下我这篇博客,我把他劝退一下 。
推荐阅读
- 淘宝产品库存是多好还是少好 淘宝库存设置太多有什么影响吗
- 茶叶有虫子还能喝吗,杜仲茶可以隔夜喝吗
- 为什么淘宝号显示零信誉 淘宝店铺过户店铺信誉还有吗
- 什么茶叶对眼睛有好处,红茶,还是绿茶[红茶]
- 淘宝直通车有几种推广方式 淘宝除了直通车还有什么可以推广的
- 茶叶沉底好还是上飘好,茶叶沉得快好还是慢好
- 明明是200M宽带,可网络为啥还是那么差?教你轻松突破网速限制
- 淘宝卖什么产品竞争最小 淘宝商品竞争度高了好还是低了好
- 阳台封起来好还是露天好?
- 怎么能注销淘宝账户 淘宝店铺注销了淘宝账户还能用吗