搗漿糊的老話題:Java是按值傳遞還是按引用傳遞

banq發表於2003-02-25
其實“Java對原始型別是按值傳遞 對於物件按引用傳遞”這個概念已經被我們接受,我們也知道這裡“按引用傳遞”的真正含義是“傳遞的引用的複製”。

但是一位IBM專家,就在“傳遞的引用的複製”上作了語義文章,最後得出“Java是按值傳遞的”。引起了很大的混亂。

看他的文章翻譯:

http://www.zdnet.com.cn/developer/code/story/0,2000081534,39049790,00.htm

文章中,專家認為是按值傳遞,譯者 cherami (好像是Java研究組織的)畫蛇添足,又否定了IBM專家的觀點,最後導致這篇文章給人非常混亂的感受,國內譯者應該養成良好的職業道德,翻譯文章應該有原文網址。
所以建議大家最好不要去看“破除java神話之二”這篇文章,ZDNet China的炒飯看來炒的是漿糊飯,漿糊,你看了這篇文章別生氣,不是在說你,看來我自己也陷入混亂了。

這位IBM專家後來又出一篇文章來繼續堅持自己的“按值傳遞”的觀點。

http://www.mhdn.net/p/2002-10-07/6044.html

很多人指責這位專家:混淆概念,這位專家進行了狡辯,他說:“
我必須承認,在我第一次認識到 Java 應用程式按值傳遞所有引數時,我也曾表示懷疑。我曾一直假定因為 Java 應用程式有兩種型別,所以他們按值傳遞基本型別而按引用傳遞引用,就像 C++ 那樣。在轉向 Java 程式設計之前我已用 C++ 程式設計好幾年了,感覺任何其他事情似乎都不直觀。但是,一旦我理解了發生的事情,我就相信 Java 語言按值傳遞所有引數的方法更加直觀。

我從他這句話中看不出什麼東西來。

最後,這篇文章:

http://outinn.myetang.com/tip/rorv.htm
原文:

又給混亂新增了一層,文章認為,按值傳遞和按引用傳遞都可能發生,“簡單型別是按值傳遞的,物件是按值傳遞也是按引用傳遞,只是參照物不同,結果也就不同”。但是文章舉例的String和Stringbuff解釋得非常混亂,無法用自己的理論來自原其說。

看來,只能研究一下IBM專家的原文了:

http://www-106.ibm.com/developerworks/java/library/j-passbyval/

最後發現,混亂的原因是大家對““Java是按值傳遞的”中的"值"的概念定義不一樣,對於原始型別,這個值就是資料本身,而在物件中的“值”就不是物件本身。

IBM專家在不同場合偷換了"值"的概念。

讓我們還是記住這樣比較清楚,容易操作的概念:

Java對原始型別是按值傳遞 對於物件傳遞的是引用的複製。

相關文章