[问题] 请教String的问题

楼主: kdok123 (小天)   2014-12-17 21:19:47
ex1:
public static void main(String[] args){
String str1 = "Hello";
System.out.println(str1);
tell(str1);
System.out.println(str1);
}
public static void tell(String str2){
str2 = "kdok123";
}
输出: Hello
Hello
结论: 因为String的值不能被修改
ex2:
class Ex2{
String temp = "Hello";
}
public class Ex2Demo{
public static void main(String[] args){
Ex2 e1 = new Ex2();
e1.temp = "kdok";
System.out.println(e1.temp);
tell(e1);
System.out.println(e1.temp);
}
public static void tell(Ex2 str2){
str2.temp = "kdok123";
}
}
输出:kdok
kdok123
问题:为什么这边的String就可以被修改呢?
java新手,问题有点浅,我觉得印出来的应该是新new出来的String,并不是原本那一个
但还是不太确定,希望有人可以帮我解释一下
作者: mimi9126 (烦呀)   2014-12-17 21:25:00
查一下pass by value应该就会知道了
楼主: kdok123 (小天)   2014-12-17 21:28:00
我知道pass by value, 可是这边的观念好像比较偏string的特性?
作者: weilum (Aquais)   2014-12-17 21:42:00
是我眼花吗 我怎么在范例2没看到r1有宣告过..
作者: wannawanna (艾维斯)   2014-12-17 22:02:00
跟String无关 是因为pass by value,内存图画出来就很清楚了
作者: LPH66 (-6.2598534e+18f)   2014-12-17 22:06:00
ex2 里你改到的是一个 Ex2 的 instance 里的成员
作者: casd82 (28dsac)   2014-12-17 23:03:00
String是immutable object的关系吧
作者: adrianshum (Alien)   2014-12-17 23:08:00
楼上:都说无关了。单纯是 pass-by-value 的问题
作者: bluelink (淡水小面仔)   2014-12-17 23:16:00
我觉得妳单纯没搞懂pass-by-value
作者: cowbaying (是在靠北喔)   2014-12-17 23:20:00
ex1要能改请把tell加上returntell里的str2已经是别的物件了ex2能动是因为你带入tell的是物件
作者: sCHb68 (sCHb68)   2014-12-17 23:31:00
ex1,相当于又产生另一个 instance(object)---str2,且都是在print str1这个 instance(object),当然值都一样。ex2,从头到尾e1跟str2都是指向同一个 instance(object),所以temp的字串值会在tell方法里受到改变。
作者: ssccg (23)   2014-12-18 05:49:00
ex1是产生一个新的reference(pass by reference value)没有产生另一个instance object刚进tell时str1跟str2是指向同一个String object重点在str1跟str2是两个不同的reference,str2改指到哪边str1都没变, ex2里面e1跟str2也一样是不同的reference刚进tell时e1和str2指向同一个Ex2 object,所以Ex2里面的temp是同一个ex1的行为相当于ex2在tell里写str2 = new Ex2(); ...
作者: swpoker (swpoker)   2014-12-18 14:10:00
字串是不能改的,那是参考有没有指向同一个

Links booklink

Contact Us: admin [ a t ] ucptt.com