這個話題一直是Java程序員的一個熱議話題,爭論不斷,可是不管是你百度搜也好仍是去看官方的文檔中所標明的也好,獲得的都只有一個結論:Java只有值傳遞。java
在這裏就不貼代碼細緻解釋了,讓咱們來看看一些論據:程序員
1.編程
「Java老是值傳遞的。不幸的是,他們(sun)決定稱 '一個對象的地址' 爲 '引用'。當咱們傳遞一個對象的值的時候,咱們傳遞的是他的引用。這會迷惑初學者。」安全
2.編程語言
「問題的關鍵是,'引用'這個詞在表達'經過引用傳遞'時有着與咱們一般在Java中的'引用'一詞徹底不一樣的意思。函數
在Java中'引用'一般意味着'對一個對象的引用'。但在編程語言理論中技術術語'引用/值傳遞'是說的'一個存儲着變量的存儲單元的引用',這是徹底不一樣的。」spa
3.設計
摘自Ken Arnold和James Gosling的(前者不太熟後者我知道是Java之父)《Java程序設計語言 第二版(ps:雖然如今都出第四版了)》:指針
「有些人會錯誤的說:Java中的對象都是"引用傳遞"。"引用傳遞"這個術語正確的意思是當一個參數傳遞給一個函數的時候,調用函數得到一個原始值的引用,而不是他的值的一個拷貝(鄙人愚見:這裏所說的對原始值的引用便是咱們常說的'傳遞的對象的一個拷貝')。若是這個函數修改了它的參數,在調用代碼中的值也會被改變,由於參數與參數都是用的相同的內存槽。很肯定的,Java只有一種傳值方式 - 這有助於保持事情的簡單性。」對象
4.
「對於那些須要更多的(證據)來被信服的:你不能用Java直接寫一個交換函數去交換兩個做爲參數傳遞的值,不論他們是對象仍是單純的值。至今交換函數對於那些容許引用傳遞的語言來講都是微不足道的。
所以Java是值傳遞的,包括指向一個方法的對象的指針。就這麼簡單。
真正的問題在於Java喜歡稱本身沒有指針;這是它做爲一個安全的語言出名的一部分。所以儘管它實際上有指針(比C++更安全),它必須稱之爲"指針"之外的東西。Sun選擇稱之爲"引用",儘管它不是業餘的企業在區分"指針"和"引用"時一般因此爲的意思。Java"引用"不像C++"引用"。Java有指向對象的指針,它的值會被傳遞給方法。」
=============================== 分割線 ===============================
總結:「Java老是值傳遞的」。咱們因此爲的按引用傳遞,其實傳遞的仍是引用中地址的值(而且是它的一個拷貝),也能夠理解爲指針的值。讓咱們所疑惑的,只是「引用」這個詞的含義,在Java中的引用和咱們廣覺得的引用是有所不一樣的。
ps:若對本文哪裏有不一樣看法或有所疑惑,能夠指出來,一同探討,如有錯誤之處還請多多見諒,提出來好作修正,感謝。
參考資料:
1.Stack Overflow:Is Java 「pass-by-reference」 or 「pass-by-value」?
2.Wiki: Java Passes By Value
3.知乎上也有個挺清晰的分析:Java 究竟是值傳遞仍是引用傳遞?