背景知識:
如果參數類型是原始類型,那么傳過來的就是這個參數的一個副本,也就是這個原始參數的值。如果在函數中改變了副本的值不會改變原始的值.
如果參數類型是引用類型,那么傳過來的就是這個參數的引用,這個引用存放的是參數的對象地址。如果在函數中沒有改變這個參數的引用地址,而是改變了地址中的 值,那么在函數內的改變會影響到傳入的參數。
如果在函數中改變了參數的引用地址,如new一個,那么函數中的局部變量就指向了一個新的對象地址,此時傳入的參數還是指向原來的地址,所以不會改變參數的值(如下圖)。
/** * * @author ZHOUMI2
* 轉自:http://blog.csdn.net/wuya814070935/article/details/49250773 */ public class Test { public static void test1(Integer num){ num = new Integer(5); } public static void test2(String str){ str.replace("1", "4"); } public static void main(String[] args) { Integer num = new Integer(1); test1(num); // 輸出結果為1 System.out.println(num.intValue()); String str = new String("123"); test2(str); // 輸出結果為123 System.out.println(str); } }
分析: 上述程序很容易讓人誤以為String類型和包裝類型是值傳遞。
其實: String類型和包裝類型都是對象類型,所以必然是引用傳遞。
但是由於String類和包裝類都被設定成不可變的,沒有提供value對應的setter方法,而且很多都是final的,我們無法改變其內容,所以導致我們看起來好像是值傳遞。