JVM基础:深入学习JVM堆与JVM栈( 五 )

Java中的参数传递时传值呢?还是传引用?

要说明这个问题 , 先要明确两点:

1.不要试图与C进行类比 , Java中没有指针的概念

2.程序运行永远都是在JVM栈中进行的 , 因而参数传递时 , 只存在传递基本类型和对象引用的问题 。 不会直接传对象本身 。

明确以上两点后 。 Java在方法调用传递参数时 , 因为没有指针 , 所以它都是进行传值调用(这点可以参考C的传值调用) 。 因此 , 很多书里面都说Java是进行传值调用 , 这点没有问题 , 而且也简化的C中复杂性 。

但是传引用的错觉是如何造成的呢?在运行JVM栈中 , 基本类型和引用的处理是一样的 , 都是传值 , 所以 , 如果是传引用的方法调用 , 也同时可以理解为 “传引用值”的传值调用 , 即引用的处理跟基本类型是完全一样的 。 但是当进入被调用方法时 , 被传递的这个引用的值 , 被程序解释(或者查找)到JVM堆中的对 象 , 这个时候才对应到真正的对象 。 如果此时进行修改 , 修改的是引用对应的对象 , 而不是引用本身 , 即:修改的是JVM堆中的数据 。 所以这个修改是可以保持的 了 。

推荐阅读