Java是值傳遞還是引用傳遞-總結


這個話題一直是Java程序員的一個熱議話題,爭論不斷,但是不論是你百度搜也好還是去看官方的文檔中所標明的也好,得到的都只有一個結論:Java只有值傳遞

 

在這里就不貼代碼細致解釋了,讓我們來看看一些論據:

1.

“Java總是值傳遞的。不幸的是,他們(sun)決定稱 '一個對象的地址' 為 '引用'。當我們傳遞一個對象的值的時候,我們傳遞的是他的引用。這會迷惑初學者。”

 

2.

“問題的關鍵是,'引用'這個詞在表達'通過引用傳遞'時有着與我們通常在Java中的'引用'一詞完全不同的意思。

在Java中'引用'通常意味着'對一個對象的引用'。但在編程語言理論中技術術語'引用/值傳遞'是說的'一個存儲着變量的存儲單元的引用',這是完全不同的。”

 

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 到底是值傳遞還是引用傳遞?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM