不纠结!Java是按值传递的!
在Java中,所有的方法参数,都是"按值传递".
有那么一种说法,Java中基本类型是按值传递,对象是按引用传递.这个说法其实是不确切的,确切的说法是
Java中基本类型将值作为参数,按值传递.对象将引用作为参数,按值传递.
所谓按值传递,就是传递的是一个副本.对象引用的副本,也算是按值传递!
现在来解释下Java方法传递引用时的情况.
比如说有一个引用 A a = new A();
将a当作参数传递的时候,传递的不是a指向的对象,也不是a引用本身,而是a的一个副本,并且这个副本和a是一模一样. 这里的一模一样就是a和副本指向同一个对象.
那么当a的副本进入方法后,对这个副本的修改同样会影响a.
但是如果进入方法后将a的副本指向其它对象的时候,那么和a是一点关系都没有了.
看一段代码和运行结果:
结果:
黑线是在方法内
红线是刚刚进入方法
蓝线是a=a2操作完成后的效果
所以当a=a2操作后,对a的任何操作都不发改变方法外的a的值。
但是如果是按引用传递,则a=a2操作后,方法外的值也就跟着改变了!
所以,java是按值传递的!!
1 楼 pmh905001 2012-03-05 如何证明这个副本是内存中真实存在的?这个副本就是作者凭空想象的东西。如果很深调用栈,那岂不是要创建很多副本?那这些副本又放在哪儿?这个像c语言的指针,传递的是一个地址的值而已。 2 楼 jwx0925 2012-03-06 pmh905001 写道如何证明这个副本是内存中真实存在的?这个副本就是作者凭空想象的东西。如果很深调用栈,那岂不是要创建很多副本?那这些副本又放在哪儿?这个像c语言的指针,传递的是一个地址的值而已。
如果是基本对象,传递的是副本。
如果是对象,传递的是对象的引用的副本。引用的副本,实际上也是值。
理解原理,不必纠结“按值”或者“按引用”