首先,咱們得首先知道什麼是「值傳遞」和「引用傳遞」。java
值傳遞(pass by value):是指在調用函數時將實際參數複製一份傳遞到函數中,這樣在函數中若是對參數進行修改,將不會影響到實際參數。
引用傳遞(pass by reference):是指在調用函數時將實際參數的地址直接傳遞到函數中,那麼在函數中對參數所進行的修改,將影響到實際參數。
複製代碼
那麼,知道這些概念以後,咱們就能夠來經過代碼來理解這些問題了。函數
代碼以下:spa
結果爲: 從當前的代碼來看,發現實際參數並無發現變化,那麼咱們就說是值傳遞了,可是僅僅是這樣簡單嗎?先不用急着下結論,來看看第二步吧。代碼以下code
結果爲: 在這裏,咱們發現,兩次打印出來的對象竟然是同樣的!實際參數竟然改變了!因而這個時候,就馬上有人來講了,java中的不是值傳遞,是引用傳遞。但是,真的是這樣嗎?cdn
這個時候,咱們須要回過頭來看看引用傳遞的定義了!對象
引用傳遞(pass by reference):是指在調用函數時將實際參數的地址直接傳遞到函數中,那麼在函數中對參數所進行的修改,將影響到實際參數。
複製代碼
咱們須要仔細理解一下這句話,它的意思是將實際參數的地址(這個地址,也就是咱們說的引用,hash值)傳遞到函數中,那麼在函數中對實際參數所進行的修改,將影響到實際參數。blog
因此,在本次的這個例子中,你既然修改的不是你傳遞進去的參數(也就是咱們說的引用),你修改的是傳遞進去的引用所指向的對象自己,那麼確定就會出現對象的變化。字符串
從一開始,你就沒有對你傳遞進去的參數進行修改!因此,這個例子自己就舉錯了。hash
那麼,怎麼纔是對傳遞進去的參數進行修改呢?請看第三步!it
代碼以下:
結果以下: 真正修改了傳遞進去的參數(也就是引用的),是下面這段代碼。user=new User();
複製代碼
而從代碼運行的結果能夠看出,實際參數並無變化。
也就是說,咱們在函數中對參數進行的修改,並無影響到實際參數。
那麼,從這裏開始,咱們能夠說是值傳遞了。這個時候咱們能夠再看一個例子。
代碼以下:
答案以下: 咱們發現,這裏咱們一樣傳遞的是對象,可是並且也是對參數所指向的對象進行修改,可是竟然沒有影響到實際參數。這和咱們的 第二步竟然不同。這裏,咱們必需要了解到一件事情,String類型的對象的修改,是和其餘基礎類型是不一致的。String類型永不可變。也就是說,在代碼
a="你";
複製代碼
中,實際的狀況是這樣的,由於java中存在字符串常量池,當咱們發現常量池中發現沒有「你」這個字符串的時候,那麼咱們將會生成一個新的對象返回。
也就是說,實際上也是對傳遞進去的引用進行了修改,可是,也沒有影響到實際參數。因此,並非引用傳遞。
java中只有值傳遞,沒有引用傳遞。