我們先複習一下Java語言對String設定的定義:
//程式碼:
String pString="Initial String";
它會分配一個新的記憶體空間給pString,
有認真看的人會熊熊想到,
class myData
{
String tString;
myData(){tString="initial string";}
}
public void changeString(myData pData)
{ pData.tString="New String";
{ pData.tString="New String";
}
//主程式
public void start()
{
myData aData=new myData();
changeString(aData);
System.out.println(aData.tString);
//這裡會印出什麼?
照上面一篇講的,String會自動分配新記憶體空間,
那這裡應該會印出initial string,原本aData.tString應該不變才對!
這...解釋起來有點複雜...過程看看就好,但應用的時候不要忘了規則!
當reference variable被傳遞時,它的內部動作是
1:拷貝一份reference variable的"位置"。
(這個"拷貝的位置",所指的內容就是原來的reference variable)
2:在function內利用"拷貝的位置"改變原本reference variable的內容
(可以參考On To Java一書,p.52頁的圖解)
<<< String 直接傳遞給函式的情況(不會變!!!) >>>
上篇所講,String之所以“不會變“,是因為:
我們把"拷貝的位置"指向一個新的空間,改變的是新空間的內容!
當函式返回時,“拷貝的位置“消失了(新空間的內容也變垃圾了)
,“原來的位置“所存放的東西仍沒有改變!
---------------------------------------------------------------------
<<< String 被包在class裡面的情況(真的會變!!!) >>>
如果String已經被包在class裡面,String tString所代表的意義是:
以aData(型別是myData )當參數整個傳遞給changeString函式時,
如果改變pData.tString,!!!!! 當於改變aData.tString所指的位置 !!!!!
因此原來aData.tString所指的空間(存"initial string"的地方)就被流放了
所以結論:
*************
如果將String包在class裡面傳遞,
函式若改變了String的值,則返回後"它真的會改變"
*************
呵呵...看不下去了吧...
把結果記下來實驗一下就知道囉!
............................................
悄悄藏匿在十舍409之神祕帥帥客
[淡泊寰宇]
u8323009@cc.nctu.edu.tw
............................................