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.'"html
從這裏也能夠看到,David 也沒那麼生硬,不過是看你從哪一個角度來認識這個問題,若是你們習慣c++的那種傳參時的理解方式,爲什麼不能這麼比較呢?java
有人已經總結過:c++
參見shell
一、對象是按引用傳遞的
二、Java 應用程序有且僅有的一種參數傳遞機制,即按值傳遞
三、按值傳遞意味着當將一個參數傳遞給一個函數時,函數接收的是原始值的一個副本
四、按引用傳遞意味着當將一個參數傳遞給一個函數時,函數接收的是原始值的內存地址,而不是值的副本
寫的沒錯,可是文字太多,第二條就已經把人弄糊塗了,得仔細看完4條才清楚。並且對String類型的疑惑沒有解決。函數
備註:對象傳遞時是引用傳遞,可是傳給函數的引用是一份拷貝的引用(也就是函數外有一份引用,函數裏有一份引用,兩份引用都會指向內存裏的對象),修改會直接改變對象的值,交換不會影響外部的引用。post
這麼簡單的事情,何須這麼繞呢?爲啥沒人跟c++過不去,偏要跟Java來勁?.net
三句話總結一下:htm
1.對象就是傳引用對象
2.原始類型就是傳值blog
3.String等immutable類型由於沒有提供自身修改的函數,每次操做都是新生成一個對象,因此要特殊對待。能夠認爲是傳值。
其餘參考文章:
http://www-128.ibm.com/developerworks/cn/java/l-jpointer/index.html