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 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。