1. 程式人生 > >Java:按值傳遞還是按引用傳遞

Java:按值傳遞還是按引用傳遞

最近看java堆疊,發現可以很好的解釋按值傳遞還是按引用傳遞

首先可以明確的說只有值傳遞

首先了解下堆疊:

棧:存放的是java的基本變數和物件的引用

堆:存放的是物件或陣列,也就是new出來的物件。

int a = 9;

這裡a就是物件的引用,9就是基本變數

Person p = new Person();

這裡p就是物件的引用,new Person()就是物件

程式執行永遠都是在棧中進行的,因而引數傳遞時,只存在傳遞基本型別和物件引用的問題。不會直接傳遞物件本身

所以如果傳遞的是基本型別,那麼傳遞的就是值,如果傳遞的是物件的引用,傳遞的就是引用的地址。

圖一:基本型別

從控制檯的結果大家可以明顯的看到對於基本型別是把值傳遞過去了,第三次打印出來的還是10,並沒有發生變化


圖二:物件的引用

物件引用是把堆地址的地址值傳遞過去了,main方法裡面的a和change方法裡面的a是兩個不同的物件的引用,他們指向同一個堆地址,

在change方法裡面修改了這個地址對應的值,那麼main方法裡面的a指向的值也改變了,所以第三次打印出來的還是20。


另外對於String來說,由於是final修飾的,所以看做和基本變數一樣處理。