数组引用不正确?JUnit工作不正常?

Aar*_*ron 1 java arrays junit pass-by-reference pass-by-value

我试图用给定的数字移动数组中的所有值.例如,具有1个移位的阵列{1,2,3,4,5}必须变为{5,1,2,3,4}.这是使用JUnit测试的.

JUnit测试是这样的:

    @Test    
    public void shift1(){
        double[] row = {1.0,2.0,3.0,4.0,5.0};
        int amount= 1;
        ArrayOperations.shift(row, amount);
        Assert.assertEquals(5.0, row [0]);
        Assert.assertEquals(1.0, row [1]);
        Assert.assertEquals(2.0, row [2]);
        Assert.assertEquals(3.0, row [3]);
        Assert.assertEquals(4.0, row [4]);      
    }
Run Code Online (Sandbox Code Playgroud)

我的方法是这样的:

public static void shift(double[] row, int amount) {
    double[] newRow= new double[row.length];
    for (int i = 0; i < newRow.length; i++) {
        newRow[(i + amount) % row.length] = row[i];
    }

    row= newRow;
}
Run Code Online (Sandbox Code Playgroud)

现在这个测试因任何未知原因而失败.我在编程课上遇到了这个问题,甚至我的老师也没找到原因.当我调试它时,数组被正确修改,导致{5,1,2,3,4}.但是JUnit失败了...但是这段代码有效:

public static void shift(double[] row, int amount) {
    double[] newRow= new double[row.length];
    for (int i = 0; i < newRow.length; i++) {
        newRow[(i + amount) % row.length] = row[i];
    }

    for (int i = 0; i < newRow.length; i++) {
        row[i] = newRow[i];            
    }
}
Run Code Online (Sandbox Code Playgroud)

谁知道为什么?row= newRow;对不对?甚至调试器也说它已经正确改变了...那么为什么第一次实现时测试失败了,而第二次实现却没有?

Jon*_*eet 5

现在这个测试因任何未知原因而失败

不,它不起作用,因为您对参数在Java中的工作方式感到困惑.这与JUnit或阵列无关.它与参数有关.

row= newRow; 对不对?

不,这不对.这只是设置参数的值,它只是方法中的局部变量.它对调用者的变量没有任何作用,这正是你所期望的.

一个更简单的例子:

String x = "foo";
method(x);
System.out.println(x); // Still prints foo...

...
static void method(String p) {
    p = "bar";
}
Run Code Online (Sandbox Code Playgroud)

所有参数都在Java 中通过传递...虽然您需要了解对于引用类型,这些值是引用(而不是对象).

我建议你找一本好的Java教程或书籍,并阅读更多有关参数传递的内容.