为什么这种无效方法不能像我期望的那样工作?

时间:2015-06-08 01:59:39

标签: java arrays void

假设Given数组实例化如下: int [] given = {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方法只是做了一些事情而且它并没有像我希望的那样被“应用”。我很欣赏这个有启发性的解释。

这个问题已经得到了回答! 我需要冻结它。

5 个答案:

答案 0 :(得分:3)

使用given = new int[5];,您将更改指定的局部变量,而不是它用于指向的对象。本地后来超出了范围。该数组永远不会被修改。

您正在创建一个全新的数组,并将用于引用原始数据的变量分配给新数组。你修改了新阵列,从不接触旧阵列。

适当的解决方案类似于以下内容:

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
}

如果你打算在实际的类中使用这个或类似的方法,显然你应该摆脱无关的代码。

答案 1 :(得分:2)

因为函数given的参数whatIsGoingOn是按值传递的。 要在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;
}

答案 2 :(得分:1)

int[]等数组是引用类型。这意味着当您执行作业given = new int[5]时,您正在查找whatIsGoingOn()中引用的数组,而不会影响change()中引用的数组。

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

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

答案 3 :(得分:1)

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

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

它仍然保留对原始数组的引用。不需要返回任何内容。

答案 4 :(得分:0)

Void很简单就不会返回任何东西。用int []替换void以达到预期的效果。也替换

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;
}