下图 这个java 关于值传递 引用传递的问题 大神详细解释一下 为什么会是这样 谢谢
s1,s2:他的值是final的 所以是不可以改变的。在方法中又重新创建了String对象,方法里的s1,s2是局部变量。当方法执行完成之后,方法内的s1 s2也就消失了。
sb1,sb2:他底层实际是对char数组进行操作的。通过change方法把sb1和sb2的地址传过来,在change方法中sb1=sb2只是把局部变量sb1的地址改变了,当方法执行完成change中的局部变量sb1也就消失了。
sb2.append(sb1):append返回的是return this,拼接之后的对象还是原对象,虽然change方法执行完成之后局部变量sb2消失了,但是堆内存中的对象数据被改变了。
字符串虽然是按照引用传递的,但是它的等号含义和一般对象不同,不是修改字符串本身,而是将字符串指向一个新创建的字符串,而字符串是不变的。
因此尽管按照引用传递了,但是修改s1 s2最后不会改变调用者。
sb2.append(sb1)改变的是sb2对象本身。
如果写
sb2 = new StringBuilder(sb2.toString()).append(sb1);
也就是让sb2指向新的对象,就不会改变调用者了。
这个问题还好,给你个链接,http://blog.csdn.net/liliang_11676/article/details/78678009
所有传递都是传递的地址,没有对其本身做出改变。
StringBuffer改变的是自己的值,出去后指针指向的值就变了
String不可变,所以生成了一个新的地址,出去后指针还是指向原先的地址
String类是immutable类型的, 意思是不可改变的, 一旦改变了就不是同一个对象了.
当然这跟上面代码里的交换关系不大.
我是这样理解的, java中调用方法, 传入对象参数, 只是把一个引用地址传过去了, 比如传入一个Student的对象stu1, 你可以修改stu1.name = "AAA",
这个修改 会真实保存到stu1对象, 但你要在方法里重新定义 stu1 = stu2, 这样的话 在方法外部(change()的调用者) 是不会影响到stu1的.
C#里可以给形参加ref 关键字, 可以完成直接交换, java里就没有了.
首先这个不是值传递和引用传递的问题,string字符串是不可变字符串,不管你怎么调用方法,它本来的长度是不会变的,而stringBuffer是可变字符串,
在调用方法之后它的长度是永久性变化的