String的疑惑

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("白癡");
}

}
對於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)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章