首页 > 解决方案 > 有人可以从我的考试中解释这个问题吗

问题描述

公共类 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”。请帮忙。

标签: arraysstatic

解决方案


数组通过引用传递。尝试创建克隆

        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|

推荐阅读