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;对不对?甚至调试器也说它已经正确改变了...那么为什么第一次实现时测试失败了,而第二次实现却没有?
现在这个测试因任何未知原因而失败
不,它不起作用,因为您对参数在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教程或书籍,并阅读更多有关参数传递的内容.