这是上面代码的字节码代码,我们可以清楚的看到a在赋值的时候都调用了StringBuilder的同String方法,现在我们来看看这个神奇的同String方法 。
@Overridepublic String toString() {// Create a copy, don't share the arrayreturn new String(value, 0, count);}12345
【天真,居然还有人认为java的参数传递方式是引用传递】这是StringBuilder中的toString方法,确实是new了一个新的对象,就算是a变成了一个新的对象,如果是引用传递,主函数的a就不会受影响吗?这点我会讲完对象类型传递之后在进行讲解,请继续往下看 。
对象类型传递其实上面的两种其实很好区分,很多人都知道是值传递,很多人说java的传递方式是引用传递的原因就是出自这里:传递的参数为对象 。
有些人看到对象传递的时候会改变主函数的值,就认为java的参数传递是引用传递,有些人又因为基本数据类型不会对主函数的值造成修改,所以他们的结论是:基本数据类型为值传递;对象类型为引用传递,想法很好,那我们现在一起来解开对象传递的神秘面纱,它到底是引用传递还是值传递呢?
go go go !!!!
还是老规矩,我们一起来看一个例子
package com.ymy.param.vo;/** * @ProjectName: demo * @Package: com.ymy.param.vo * @ClassName: LolVo * @Author: 流星007 * @Description: lol英雄属性 * csdn:https://blog.csdn.net/qq_33220089 * 今日头条:https://www.toutiao.com/c/user/5372182357/#mid=1637641735275523 * @Date: 2020/7/5 15:11 * @Version: 1.0 */public class LolVo {/*** 姓名*/private String name;/*** 职业*/private String profession;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getProfession() {return profession;}public void setProfession(String profession) {this.profession = profession;}@Overridepublic String toString() {return "LolVo{" +"name='" + name + ''' +", profession='" + profession + ''' +'}';}}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051package com.ymy.param;import com.ymy.param.vo.LolVo;/** * @ProjectName: demo * @Package: com.ymy.param * @ClassName: ObjectTypeTest * @Author: 流星007 * @Description: 对象类型传递 * csdn:https://blog.csdn.net/qq_33220089 * 今日头条:https://www.toutiao.com/c/user/5372182357/#mid=1637641735275523 * @Date: 2020/7/5 15:16 * @Version: 1.0 */public class ObjectTypeTest {public static void main(String[] args) {LolVo lolVo = new LolVo();lolVo.setName("无极剑圣");lolVo.setProfession("刺客");dosomthing(lolVo);System.out.println("主函数 lolVo = "+lolVo);}private static void dosomthing(LolVo lolVo) {lolVo.setProfession("战士");System.out.println("dosomthing lolVo = "+lolVo);}}1234567891011121314151617181920212223242526272829303132333435
结果如下:
dosomthing lolVo = LolVo{name='无极剑圣', profession='战士'}主函数 lolVo = LolVo{name='无极剑圣', profession='战士'}Process finished with exit code 01234
主函数中剑圣的职业是刺客,在dosomthing中将他修改成战士,我们发现主函数中剑圣的职业也被修改成战士了,显然这符合引用传递的条件,被调用方修改会影响到调用方也就是主函数,所以这个时候很多人就认为java的对象传递的方式为引用传递,如果你也是这么认为,那么你就要认真看一下我后面的分析 。
我们先来一个否定它是引用传递的例子,请看好,不要眨眼
package com.ymy.param;import com.ymy.param.vo.LolVo;/** * @ProjectName: demo * @Package: com.ymy.param * @ClassName: ObjectTypeTest * @Author: 流星007 * @Description: 对象类型传递 * csdn:https://blog.csdn.net/qq_33220089 * 今日头条:https://www.toutiao.com/c/user/5372182357/#mid=1637641735275523 * @Date: 2020/7/5 15:16 * @Version: 1.0 */public class ObjectTypeTest {public static void main(String[] args) {LolVo lolVo = new LolVo();lolVo.setName("无极剑圣");lolVo.setProfession("刺客");dosomthing(lolVo);System.out.println("主函数 lolVo = "+lolVo);}private static void dosomthing(LolVo lolVo) {lolVo = new LolVo();lolVo.setProfession("战士");System.out.println("dosomthing lolVo = "+lolVo);}}123456789101112131415161718192021222324252627282930313233343536
做了小小的改动,仅仅只是在dosomthing方法中加了一行代码:lolVo = new LolVo();
我们再来看运行结果是什么呢?还会和上面一样吗?
dosomthing lolVo = LolVo{name='null', profession='战士'}主函数 lolVo = LolVo{name='无极剑圣', profession='刺客'}Process finished with exit code 01234
推荐阅读
- 淘宝产品库存是多好还是少好 淘宝库存设置太多有什么影响吗
- 茶叶有虫子还能喝吗,杜仲茶可以隔夜喝吗
- 为什么淘宝号显示零信誉 淘宝店铺过户店铺信誉还有吗
- 什么茶叶对眼睛有好处,红茶,还是绿茶[红茶]
- 淘宝直通车有几种推广方式 淘宝除了直通车还有什么可以推广的
- 茶叶沉底好还是上飘好,茶叶沉得快好还是慢好
- 明明是200M宽带,可网络为啥还是那么差?教你轻松突破网速限制
- 淘宝卖什么产品竞争最小 淘宝商品竞争度高了好还是低了好
- 阳台封起来好还是露天好?
- 怎么能注销淘宝账户 淘宝店铺注销了淘宝账户还能用吗