捣浆糊的老话题:Java是按值传递还是按引用传递

其实“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对原始类型是按值传递 对于对象传递的是引用的拷贝。

up 一下

在think in java中 :

这两种见解:
"Java按值传递任何东西"(IBM专家观点)

“Java主要按值传递,但对象是按引用传递”

作者指出关于这两种分歧归根到底是由于对“引用”的不同解释造成的。这个问题争论下去其实没有意义。

其实这样的问题很少在我们实践中遇到,为什么?
因为这里有一个Java的编程习惯:
尽量避免在方法体内改变方法的参数。

如果遵循良好的面向对象的编程习惯,这里古怪的问题就不会在我们程序中碰到,反之,如果你碰到了,说明你要好好读一下thinking in java