Java是值传递还是引用传递

155 阅读1分钟

注:本专栏文章均为本人原创,未经本人授权请勿私自转载,谢谢。

首先说结论:在 Java 的方法调用传参时,无论是基本数据类型还是对象,都是值传递的

在对象创建时

使用 new 操作符创建对象后,会 在堆上创建一个对象,并且在当前方法栈中相应的操作数栈上会压入该对象的引用地址。

在方法调用时

在其他方法里通过参数传递使用某对象时,仅是通过值传递将该对象的引用地址传递给调用方

所以我们可以使用该引用来改变其引用对象的内容,却无法使用该引用改变外部调用方引用的指向(例如将外部调用方引用指向其他新 new 的对象),因为它只是外界的引用拷贝。

拓展
C++ 中的 & 操作符是真正的引用传递,它通过参数传入的就是对象或值本身,可以在调用方法内改变外部调用方引用的指向。
但是对于大多数情况来说,在方法内改变对象指向往往会导致不可预料的后果。所以 C++ 中 & 引用操作符往往与 const 关键字结合使用,以禁止在方法内改变对象引用。
另外,C++中在进行方法参数传递时,会调用对象的拷贝构造函数生成一个新的对象传递到方法中,效率很低,所以一般使用 const & 的方式让传参提速,这与 Java 中的默认方法调用实现类似,只是 Java 多了次内存地址的拷贝过程。