引用传递与值传递
值传递:传值,把原来的数据直接拷贝一份传给新的变量
引用传递:传地址,使原来的引用变量指向新的地址中的内容
奇怪的事情
String str = "aaa";
change(str);
System.out.println(str);
public void change(String str){
str += "aaa";
}
输出结果依然是aaa , 而不是aaaaaa
出现这种情况是,在主函数中的str与调用函数中定义的str是两个不同的引用,并且他们确实是指向了同一个地址,但是因为String是不可变的,所以在执行语句str+="aaa"的时候实际是创建了一个新的对象,使的调用函数中的引用指向了新的对象,所以主函数中的str不会有任何的影响。
如果调用函数中的变量类型不是String,而是可变的StringBuilder类型,那么实际情况分为两种,如果是str.append("aaa");那么主函数中的str是会改变的,如果是str = new StringBuilder("ccc");那么主函数中的值依然不会受到影响。
主要的原因是在与赋值操作“=”。如果是复制操作,则标识把调用函数中的str指向一个新的内存空间,那么与原来的引用失去关联,原来的很明显不会受到印象,如果是append操作,只是在原来的内存地址上改变内存中的内容,但是此时不管是主函数中的str还是调用函数中的str,指向的都是被改变后的内存,很自然的值会受到影响。
实际的参数传递中会遇到4中情况:
- 基本类型
毫无疑问的传值操作,调用函数与主函数中的变量不存在任何的联系
int a =10; change(a); System.out.println(a); public void change(int a){ a++; }
输出结果为10
- 不提供改变自身方法的引用类型
是传递的是引用,但是无法对共同指向的对象进行改变操作,只能创建一个新的对象,调用函数中的引用指向他,不影响主函数中的值
String a = "aaa"; change(a); System.out.println(a); public void change(String a){ a += "aaa"; }
输出的结果是aaa
- 提供改变自身方法的引用类型,并且使用该方法
StringBuilder a = new StringBuilder("aaa");
change(a);
System.out.println(a);
public void change(StringBuilder a){
a.appned("aaa");
}
输出结果为aaaaaa
- 提供改变自身方法的引用类型,但是不使用该方法,而是使用赋值操作
StringBuilder a = new StringBuilder("aaa");
change(a);
System.out.println(a);
public void change(StringBuilder a){
a = new StringBuilder("bbb");
}
输出结果为aaa
参考材料:[知乎:引用传递还是值传递][知乎]
[知乎]: https://www.zhihu.com/question/31203609 "引用传递与值传递"
不积跬步无以至千里
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥