[問題] 請教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