引用类型方法传参的一点领悟
来源:互联网 发布:网络用语128是什么意思 编辑:程序博客网 时间:2024/06/10 17:36
引用类型方法传参的一点领悟
下午碰到一道笔试题,是非常常见的关于引用类型方法传参的题目。代码如下:
public class Demo4 { public static void main(String[] args) { StringBuilder a = new StringBuilder("a"); StringBuilder b = new StringBuilder("b"); operator(a,b); System.out.println(a); System.out.println(b); } private static void operator(StringBuilder a, StringBuilder b) { a.append(b); b = a; System.out.println(a); System.out.println(b); }}
毫不犹豫的选择了答案。
ab
ab
ab
ab
结果一对答案,傻眼了。
正确答案是:
ab
ab
ab
b
瞬间感觉自己的世界观有点动摇。不应该啊。
你看,一开始,有两个StringBuilder的引用,引用a指向一个内容为’a’的StringBuilder对象,引用b指向一个内容为’b’的StringBuilder对象。至此相安无事。
然后出现了一个 operator的方法,让引用a和引用b去方法里逛一圈。
重点来了,我们都知道引用类型做形参,传的不是对象本身,而是对象在内存中的地址。
我坚持这个思想,然后跟着a和b继续往下走。
在operator中,首先a被追加了b对象的值,”b”,至此引用a指向的对象,值已经变成ab了。
嗯,然后b=a,引用a的对象地址被赋值给引用b,至此两个引用都指向了同一个对象。
那么后续两句输出,都是ab,没错。
高潮来了,operator方法结束后,main方法中继续往下执行,输出引用a和引用b的值。
引用a指向的是值为ab的对象,输出ab。
引用b指向的是值为ab的对象,输出ab。
没错,以上是我的思路。
程序运行结果打碎了我的认知。
我开始重新思索。
一开始引用a和b都指向各自的对象,碰见方法,方法要了引用a、b各自对象的内存地址,赋值给了自个儿的引用a、b。
a指向的对象被修改,那么main中引用a和operator中的引用a都能看见被修改后的对象,ab。
然后引用b被指向了a的对象,那么此刻b也能看见ab。
出了方法后,main中的a指向没变,输出ab。
引用b指向修改后的对象。。。。
等等!
main方法中的引用地址被改了吗??
电石火花之间,画了一张图。
至此清楚了。
operator中的引用,和main中的引用根本就是两回事!
不要问我为什么一开始我会认为operator中的引用指向被修改,会导致main中的引用也被修改……
我打算把锅甩给“人一到下午脑子就不好使”。
- 引用类型方法传参的一点领悟
- 传参和引用的一点启示
- 对iOS中block的一点领悟
- 关于地址运算的一点领悟
- 对Fragment生命周期的一点领悟
- Java方法中引用类型的形参传递问题
- 关于一个公司的产品、技术、运营的一点领悟
- 值类型和引用类型的传参问题
- 数据库锁、事务以及隔离级别的一点领悟
- 关于快速选择算法,自己的一点小领悟
- 关于单例设计的一点小领悟
- iOS关于TableView重用Cell的一点领悟
- java方法参数传值传引用的一点看法
- java方法参数传值传引用的一点看法
- C#中对值类型和引用类型的一点认识
- 基本类型与引用类型的检测方法
- 引用类型Array类型的常用方法总结
- 方法参数是基本类型和引用类型的区别
- 示例:设置程序为开机启动项
- 学习笔记——Kaggle_Digit Recognizer (KNN算法 Python实现)
- c#=>lambda表达式的理解
- 每日论文Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network
- linux 下火狐打开缓慢解决的方法
- 引用类型方法传参的一点领悟
- 使用TCP-IP Monitor监视Soap协议
- 毛玻璃效果
- 直播技术
- 视频基础
- leetCode 166. Fraction to Recurring Decimal
- H.265(HEVC)深度解析
- 非对称加密算法DH
- 剑指offer:旋转数组的最小位置