作者:fbysss
blog:blog.csdn.net/fbysss
聲明:本文由fbysss原創,轉載請注明出處
關鍵字:java 傳值 傳引用
這是個老生常談的問題了,引起過無數争論,但可以說一直沒有一個令人滿意的回答。
有些人非要故弄玄虛,把傳引用說成是棧裡面放的是引用的值,說隻有傳值沒有傳引用,那看看這句經典名言吧:
o'reilly's java in a nutshell by david flanagan (see resources) puts it best: "java manipulates objects 'by reference,' but it passes object references to methods 'by value.'"
從這裡也可以看到,david 也沒那麼生硬,不過是看你從哪個角度來認識這個問題,如果大家習慣c++的那種傳參時的了解方式,為何不能這麼比較呢?
有人已經總結過:
參見
http://www.javaresearch.org/article/3156.htm
1、對象是按引用傳遞的
2、java 應用程式有且僅有的一種參數傳遞機制,即按值傳遞
3、按值傳遞意味着當将一個參數傳遞給一個函數時,函數接收的是原始值的一個副本
4、按引用傳遞意味着當将一個參數傳遞給一個函數時,函數接收的是原始值的記憶體位址,而不是值的副本
寫的沒錯,但是文字太多,第二條就已經把人弄糊塗了,得仔細看完4條才清楚。而且對string類型的疑惑沒有解決。
這麼簡單的事情,何必這麼繞呢?為啥沒人跟c++過不去,偏要跟java來勁?
三句話總結一下:
1.對象就是傳引用
2.原始類型就是傳值
3.string等immutable類型因為沒有提供自身修改的函數,每次操作都是新生成一個對象,是以要特殊對待。可以認為是傳值。
其他參考文章:
http://www-128.ibm.com/developerworks/cn/java/l-jpointer/index.html
http://dreamhead.blogbus.com/logs/2005/05/1189478.html
http://www.javaeye.com/topic/12961