例如:
結果如下:
5
5
調用函數changevalue()前後num的值都沒有改變。具體過程如圖:

num作為參數傳遞給changevalue(int x)方法時,首先在記憶體空間中為x變量配置設定一個存儲單元(我們說x指向這個存儲單元)。
将記憶體空間中num指向的存儲單元中存放的值(即”5”),傳遞給了changevalue(int x)中的參數變量(即”x”),也就是把”5”傳給了x變量指向的存儲單元中。
changevalue(int x)方法中對x變量的一切操作,都是針對x指向的存儲單元。與num指向的存儲單元沒有關系,當然也不會改變這個存儲單元中的值。
是以,值傳遞,傳遞的是存儲單元中的内容(8種基本類型:值,非基本類型:實際對象的位址)。
java中隻有值傳遞,沒有引用傳遞。
所謂的引用傳遞,隻是一個錯誤的概念。
執行後結果:
jack
rose
從結果看,方法用了一個對象參數,操作參數就可以改變傳入對象。我們的對引用傳遞的錯誤觀念這麼認為:
該對象複制了一個引用副本,傳給調用方法的參數,使得該方法可以對這個對象進行操作。
這種觀念是初學者常犯的錯誤。
實際上過程如圖:
main方法中new了一個對象person,存儲空間中實際配置設定了兩個對象:新建立person類的實體對象、指向該對象的引用變量person。
其中,實體對象存放在堆記憶體中,引用變量存放在棧記憶體(java存儲特性)。
了解更多java存儲看這裡:
引用變量person指向的棧記憶體中,存放的是堆中實體對象的邏輯位址。
調用changename(person p)方法,将person引用變量傳入該方法參數p中(按照值傳遞,傳遞的是:實體對象的邏輯位址)。此時,changename方法中對p的操作,與person沒有關系。
changename方法中,是對p指向的存儲單元中的值(即實體對象的邏輯位址)所指向的實體對象進行操作。直接改變了該實體對象。
由于person指向的存儲單元中的值也是該實體對象的邏輯位址,這個實體對象已經在第4步中被改變了。是以有上面的結果。
引用傳遞是個僞概念,java中隻有值傳遞。
原文位址:http://blog.csdn.net/ooppookid/article/details/51225815