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。
此时 data 和 arr 指向同一块堆内存,所以修改数组内容会反映到原变量上。
但如果在方法中让 arr = new int[]{7,8,9},只会修改形参自己的引用指向,不会影响 data,因为引用值的拷贝本身已经完成。理解这一点,有助于我们在并发和性能场景中正确判断对象共享、逃逸分析以及 GC 压力来源。
评论 0