Java 底层视角:对象引用、堆内存与方法调用的真实关系

Java 底层视角:对象引用、堆内存与方法调用的真实关系

在 Java 中,经常有人问:“Java 是引用传递还是值传递?”从 JVM 底层视角看,Java 永远是值传递,只不过传递的是对象引用的值

先看一段代码:

public class Demo { public static void change(int[] arr) { arr[0] = 99; }

public static void main(String[] args) {
    int[] data = {1, 2, 3};
    change(data);
    System.out.println(data[0]);
}

}

运行结果是 99。原因并不是“按引用传递”,而是:data 中保存的是 堆内存中数组对象的地址值。调用 change 时,JVM 会把这个地址值复制一份传给参数 arr。 此时 dataarr 指向同一块堆内存,所以修改数组内容会反映到原变量上。

但如果在方法中让 arr = new int[]{7,8,9},只会修改形参自己的引用指向,不会影响 data,因为引用值的拷贝本身已经完成。理解这一点,有助于我们在并发和性能场景中正确判断对象共享、逃逸分析以及 GC 压力来源。

评论 0