精華區beta java 關於我們 聯絡資訊
我們先複習一下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 ............................................