写程序时,遇到一个问题,故记录下来,有如下程序:
public class Test {
public static void main(String[] args) {
int[] nums = {1, 1, 1, 1};
test(nums);
System.out.println(Arrays.toString(nums));
}
public void test(int[] numsTemp) {
numsTemp= new int[]{2,2,2,2};
}
}
运行结果:
nums = [1, 1, 1, 1]
分析原因
注意实参和形参的区别!不要因为实参和形参名一样,就混淆!
以上述代码为例,我们首先将实参 nums 数组对象的地址传给形参 numsTemp ,此时 nums 对象和 numsTemp 对象指向堆内同一块内存空间,如下图所示。
若此时对 numsTemps 对象内存中的数据进行操作,会改变 nums 对象内存空间中的数据,例如
numsTemp[0] = 2; numsTemp[1] = 2;
最后输出结果为:
nums=[2, 2, 1, 1]
但是当执行代码 numsTemp= new int[]{2,2,2,2}; 时,形参numsTemp 对象被赋予新的内存地址,如下图所示。
因此,当 test() 函数执行完毕后,实参 nums 并未有任何改变。



