String與其他類有什麼不同嗎?
public class Test {
public static void main(String[] args) {
String s = "pig";
changeStr(s);
System.out.println(s);// pig (爲啥還是pig啊,沒有改變)
Person p = new Person();
System.out.println(p.getName());// 白癡 ,發生改變了
}
public final static void changeStr(String temp) {
temp = "dog";
}
public final static void changePersonName(Person p) {
p.setName("白癡");
}
}
public static void main(String[] args) {
String s = "pig";
changeStr(s);
System.out.println(s);// pig (爲啥還是pig啊,沒有改變)
Person p = new Person();
System.out.println(p.getName());// 白癡 ,發生改變了
}
public final static void changeStr(String temp) {
temp = "dog";
}
public final static void changePersonName(Person p) {
p.setName("白癡");
}
}
對於String輸出的結果仍舊是pig,沒有變爲dog!
有點奇怪啊!
據我推測可能是這樣的(只是推測):
1.在 1 處 ,將實參s (其實就是個句柄,呵呵,我覺得就是C++中的指針)複製一份給 形參temp,示意圖如下:
句柄 | 地址 |
s | 地址A |
temp | 地址A |
數據:
地址 | 數據 |
地址A | pig |
所以在此時,
System.out.println(s);
System.out.println(temp);
的結果將都是pig
2.但當運行至 2 時情況有所變化:
代碼temp = "dog";並沒有起到如下作用:
另內存中的數據變爲
地址 | 數據 |
地址A | dog |
相反的temp = "dog";執行了一個相當 temp=new String("dog");的代碼。
(呵呵,猜測,我想這是String類的特別之處!還請各位不吝賜教!)
PS:而我們編寫的Person類則不會出現這種情況,所以我們看到了數據的變化,“弱智”變爲了“白癡”!
所以造成如下局面:
句柄 | 地址 |
s | 地址A |
temp | 地址B |
數據:
句柄 | s數據 |
地址A | dog |
地址B | pig |
這就是爲什麼String與我們正常編寫的類如-Person類的不同之處!至於String爲什麼,以及如何實現的俺以後咱學習,呵呵!
PS:java中所有的函數調用本質上都是值傳遞,也就是說函數的形參的值只是實參值的一個副本,不同的是,如果實參是個對象句柄(例如Person類,String類的對象),那麼形參所獲得就是這個對象句柄的副本;如果傳遞的是基本類型(如int a=3),那麼我們得到就是這個基本類型的副本(這裏即使3)。