Java中的参数传递到底是引用还是值传递?

看了很多中文文章讨论这个问题,结果都感觉是臆测的,没什么根据。再看一些英文文章,一致表示:Java中所有的参数传递都是“值传递”。引用其中两篇如下:

http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

http://www.yoda.arachsys.com/java/passing.html

正如第二篇文章指出的那样,传说是:

对象通过引用传递,原始类型通过值传递。真是这样吗?

事实是:

1、Java中所有东东都是通过值传递。而对象,压根就不会被传递。

2、变量的值要么是原始类型,要么就是引用,而不是对象本身。

看起来有点费解。实际上是,方法参数传递过去的是一个原来对象引用的copy,这一点可以从第一篇文章的图看出来。如果你在方法中改变内容,因为这个copy也是指向那个对象,所以改动会生效。但是如果你对这个对象的引用进行操作,例如argObject = new SomeObject();这样的操作是无效的,因为你改变的是copy,原来的引用还是指向原来的Object。就这么简单。

 

补充一句:实际上.NET中的引用传递方式是一样的,也只是传递了一个引用的Copy过去。所以上述第一篇文章的例子在.NET下会得到同样的结果。详情可以去看看之前的堆栈系列文章第二篇的结尾部分。 : )

posted @ 2009-02-11 11:54  痘痘熊  阅读(2244)  评论(5编辑  收藏  举报