java数组参数传递是值传递,传递的是数组引用的副本;修改元素影响外部,重赋引用不影响外部,本质是引用类型按值传递。

Java 中数组作为参数传递时,实际传递的是数组对象的引用(即地址)的副本,属于“引用传递的值”,但常被简化为“按值传递”。要验证其值传递特性,关键在于观察:方法内部对数组引用本身重新赋值是否影响外部原数组;而对数组元素的修改则会影响外部——这恰恰体现了“传的是引用的副本”这一本质。
验证一:修改数组元素 → 外部可见
在方法中通过索引改变数组内容,调用后原数组对应位置值已变。这是因为形参和实参指向同一块堆内存:
public static void changeElement(int[] arr) {
if (arr != null) arr[0] = 999; // 修改元素
}
public static void main(String[] args) {
int[] a = {1, 2, 3};
changeElement(a);
System.out.println(Arrays.toString(a)); // 输出 [999, 2, 3]
}
验证二:重新赋值数组引用 → 外部不受影响
若在方法内让形参指向新数组(或 null),原数组引用不变,证明传入的是“引用的副本”而非引用本身:
public static void reassignArray(int[] arr) {
arr = new int[]{10, 20}; // 形参指向新数组
// 或 arr = null;
}
public static void main(String[] args) {
int[] a = {1, 2, 3};
reassignArray(a);
System.out.println(Arrays.toString(a)); // 仍输出 [1, 2, 3]
}
验证三:对比基本类型与数组的行为差异
把 int 参数和 int[] 参数并列测试,能更清晰凸显区别:
- 传 int:方法内修改变量值,不影响外部 —— 典型值传递
- 传 int[]:方法内修改 元素,影响外部;修改 引用本身,不影响外部 —— 说明传的是引用的拷贝
小结:核心看“谁变了”
判断 Java 是否值传递,不看能否修改对象内容,而看形参变量本身的指向能否改变实参变量的指向。数组参数满足:形参重赋值 ≠ 实参变化 → 符合值传递定义。所谓“数组是引用传递”是口语误读;准确说是“引用类型的值传递”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











