为什么这个 void 方法没有像我预期的那样工作?

Why is this void method not working as I would expect?

假设实例化Given数组如下: int[] 给定 = {1, 2, 3, 4, 5};

这些方法应该改变数组并显示打印结果。

public int[] change(int[] given) {
   out.println(Arrays.toString(given)); //before-changes
   whatIsGoingOn(given); //make changes
   out.println(Arrays.toString(given));//after changes
   return given; //return the supposedly changed array
}
//Make changes:
public void whatIsGoingOn(int[] given) {
   given = new int[5];
   given[0] = 200;
}

我认为问题出在 void 方法上,它覆盖了给定的 int[] 的原始值,但新的初始化和声明永远无法解决。

我希望数组是:

{200, 0, 0, 0, 0};

但是 Java 打印出来:

{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5}

但是如果我在 whatIsGoingOnMethod 中返回一个新更改的数组,我得到了我想要的结果:

{1, 2, 3, 4, 5}
{200, 0, 0, 0, 0}

如果 void 方法只是做了一些事情,而不是像我期望的那样 "applied"。如果对此有启发性的解释,我将不胜感激。

这个问题已经回答了,谢谢!!! 我需要冷冻它。

Void 很简单 return 什么都没有。将 void 替换为 int[] 以获得预期结果。也替换

public void whatIsGoingOn(int[] given) {
   given = new int[5];
   given[0] = 200;
}

public int[] whatIsGoingOn(int[] given) {
   given = new int[5];
   given[0] = 200;
   return given;
}

最后的结果应该是

public int[] change(int[] given) {
   out.println(Arrays.toString(given)); //before-changes
   given = whatIsGoingOn(given); //make changes
   out.println(Arrays.toString(given));//after changes
   return given; //return the supposedly changed array
}
//Make changes:
public int[] whatIsGoingOn(int[] given) {
   given = new int[5];
   given[0] = 200;
   return given;
}

given = new int[5]; 中,您正在更改给定的局部变量指向的内容,而不是它过去指向的对象。 local 稍后超出范围。数组永远不会被修改。

您正在创建一个全新的数组,并将用于引用原始数组的变量分配给新数组。您正在修改新数组,并且永远不会触及旧数组。

适当的修复类似于以下内容:

public static void main(String[] args)
{
    int[] original = new int[5];//already allocating memory, initializing to default value, etc.
    setFirstTo20(original);
    System.out.println(original[0]);//still 20!
}

public static void setFirstTo20(int[] given)
{
    for (int i : given)
        System.out.println(i);//for debugging, before change
    given[0] = 20;
    for (int i : given)
        System.out.println(i);//after change
    //heres whats happening to you
    given = new int[5];
    given[0] = 40;
    for (int i : given)
        System.out.println(i);//show new changes to NEW array
}

显然,如果您打算在实际 类.

中使用此方法或类似方法,则您应该删除无关代码

int[]等数组是引用类型。这意味着当您执行赋值 given = new int[5] 时,您正在链接 whatIsGoingOn() 中引用的数组,而不影响 change().

中引用的数组

要执行您想要的操作,您需要遍历数组并更改数组中的各个元素。

for(int i = 0; i < given.length; i++) {
    given[i] = 0;
}
given[0] = 200;

因为函数whatIsGoingOn的参数given是按值传递的。 要在 void 函数中更改它,您必须将它包装在一个对象中,如下所示:

class ArrayRef {
    public int[] array;
}
public int[] change(int[] given) {
    out.println(Arrays.toString(given)); //before-changes
    ArrayRef ref = new ArrayRef();
    ref.array = given; //set a reference to the given array
    whatIsGoingOn(ref); //make changes
    given = ref.array; //get the changed array
    out.println(Arrays.toString(given));//after changes
    return given; //return the supposedly changed array
}
//Make changes:
public void whatIsGoingOn(ArrayRef ref) {
    ref.array = new int[5];
    ref.array[0] = 200;
}

更改 whatIsGoingOn 方法的以下几行
given = new int[5];
given[0] = 200;

Arrays.fill(given,0);
given[0] = 200;

它仍然保留对原始数组的引用。不需要 return 任何东西。