arrays - 有人可以从我的考试中解释这个问题吗
问题描述
公共类 ExamPreparationDemo {
public static int[] arrayDivisionByD2(int[] numbers) {
for(int i = 0; i < numbers.length; i++)
numbers[i] = numbers[i]/2;
return numbers;
}
公共静态无效主要(字符串[]参数){
int[] numbers = {3,8,9,10};
int[] numbers2 = arrayArrayDivisionBy2(numbers);
System.out.println(Arrays.toString(numbers));
System.out.println(Arrays.toString(numbers2));
// 我的问题:当我运行我的程序时,我看到 "1,4,4,5" "1,4,4,5"。但是为什么我的变量“数字”没有保持不变?即“3,8,9,10”?他们都改变了,而我只想改变“numbers2”。请帮忙。
解决方案
数组通过引用传递。尝试创建克隆
int[] numbers = {3,8,9,10};
int[] numbers2 = numbers.clone(); //create a clone of array
numbers2 = arrayDivisionByD2(numbers2); //passing new cloned array as param
解释
当您通过方法传递“数字”时
概念“通过引用调用”进入画面
其中传递第一个块的地址(包含 3 的内存块的地址)而不是值 3,8,9,10
numbers --> |3|8|9|10|
现在,无论您执行了什么更改,实际上都被原始数组所继承
并且方法“arrayDivisionByD2”返回对更新数组的引用,而不是包含更新的不同数组
这意味着 "numbers" 和 "numbers2" 指向同一个数组(这是 1,4,4,5 打印两次的原因)而不是两个单独的数组
numbers and numbers2 --> |1|4|4|5|
这将打印 3,8,9,10 和 1,4,4,5
并且在答案中,创建了原始数组的克隆,并通过方法传递了它。然后,对这个克隆的数组进行了更改
导致有两个单独的数组
numbers --> |3|8|9|10|
numbers2 --> |1|4|4|5|