天天看點

Java千百問_05面向對象(011)_引用傳遞和值傳遞有什麼差別

例如:

結果如下: 

5

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

Java千百問_05面向對象(011)_引用傳遞和值傳遞有什麼差別

num作為參數傳遞給changevalue(int x)方法時,首先在記憶體空間中為x變量配置設定一個存儲單元(我們說x指向這個存儲單元)。

将記憶體空間中num指向的存儲單元中存放的值(即”5”),傳遞給了changevalue(int x)中的參數變量(即”x”),也就是把”5”傳給了x變量指向的存儲單元中。

changevalue(int x)方法中對x變量的一切操作,都是針對x指向的存儲單元。與num指向的存儲單元沒有關系,當然也不會改變這個存儲單元中的值。

是以,值傳遞,傳遞的是存儲單元中的内容(8種基本類型:值,非基本類型:實際對象的位址)。

java中隻有值傳遞,沒有引用傳遞。 

所謂的引用傳遞,隻是一個錯誤的概念。 

執行後結果: 

jack 

rose

從結果看,方法用了一個對象參數,操作參數就可以改變傳入對象。我們的對引用傳遞的錯誤觀念這麼認為: 

該對象複制了一個引用副本,傳給調用方法的參數,使得該方法可以對這個對象進行操作。 

這種觀念是初學者常犯的錯誤。

實際上過程如圖:

Java千百問_05面向對象(011)_引用傳遞和值傳遞有什麼差別

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