首先说结论:Java 中的参数传递是值传递:
看下面第一个例子:
我们将a(基本数据类型int)当作参数
可以看到:实参并没有改变
因为基本数据类型是存在在栈中的,在传参时,会将数据创建一个副本同样放入栈中,这个副本改变了,而我们的实参并没有改变,这符合值传递
再看第二个例子:
这里我没有重写tostring方法,结果如下,可以看到, 形参和实参是一样的
那么可能有小伙伴质疑java不是值传递,我们看下图:
对象的引用存放在栈中,而我们的对象存放在堆中
在传参过程中,同例子1一样,会在f方法中创建一个副本,这个副本同样指向堆中的同一对象
实参指向的对象其实没有变,而我们又把name值给改了,就好像是对象改变了,实际没有变
还是符合值传递的
再看第三个例子:我们直接在方法中重新new一个新的对象
结果如下
此时形参和实参又不一样的,其实原理是一样的:
我们在new的过程中,将副本指向了新的对象而已
实参的指向从未发生过改变,符合值传递