Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

Java 到底是值传递还是引用传递?

查看完整题解

参考回答

直接回答

Java 只有值传递。传入基本类型时,复制的是基本值;传入引用类型时,复制的是引用值。方法可以通过这个引用访问同一个对象,但把形参重新指向另一个对象,不会让调用方的变量跟着改指向。

讲清原理

可以把引用想成写有某个房间位置的纸条。把纸条复印一份交给别人,两个人都能去同一个房间搬东西;但对方在自己的纸条上改写地址,不会改掉你手里的那张纸。

因此要分开观察“修改对象内部数据”和“给形参重新赋值”。前者可能被调用方看见,因为访问的是共享对象;后者只改了方法内部那个变量。数组、集合和普通对象都遵守这条规则。

方法收到引用值的副本,仍可访问同一个对象
方法收到引用值的副本,仍可访问同一个对象

例子与易错点

static void change(int[] a) {
    a[0] = 9;
    a = new int[]{7};
}

若调用前 int[] values = {1};,执行 change(values) 后 values[0] 是 9,不是 7。方法先改了原数组,随后只把自己的形参指向新数组。“能在方法里改变数组元素”不能证明 Java 是引用传递。

相关题:第 13 题、第 34 题、第 49 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。