楼主:
kdok123 (小天)
2014-12-17 21:19:47ex1:
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,并不是原本那一个
但还是不太确定,希望有人可以帮我解释一下
楼主:
kdok123 (小天)
2014-12-17 21:28:00我知道pass by value, 可是这边的观念好像比较偏string的特性?
作者:
weilum (Aquais)
2014-12-17 21:42:00是我眼花吗 我怎么在范例2没看到r1有宣告过..
跟String无关 是因为pass by value,内存图画出来就很清楚了
作者:
LPH66 (-6.2598534e+18f)
2014-12-17 22:06:00ex2 里你改到的是一个 Ex2 的 instance 里的成员
作者: casd82 (28dsac) 2014-12-17 23:03:00
String是immutable object的关系吧
楼上:都说无关了。单纯是 pass-by-value 的问题
作者:
bluelink (淡水小面仔)
2014-12-17 23:16:00我觉得妳单纯没搞懂pass-by-value
ex1要能改请把tell加上returntell里的str2已经是别的物件了ex2能动是因为你带入tell的是物件
作者:
sCHb68 (sCHb68)
2014-12-17 23:31:00ex1,相当于又产生另一个 instance(object)---str2,且都是在print str1这个 instance(object),当然值都一样。ex2,从头到尾e1跟str2都是指向同一个 instance(object),所以temp的字串值会在tell方法里受到改变。
作者:
ssccg (23)
2014-12-18 05:49:00ex1是产生一个新的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字串是不能改的,那是参考有没有指向同一个