新手传递副本混乱

时间:2012-11-25 21:54:57

标签: java

所以我认为Java是一种逐字复制的语言(至少与我迄今为止从书中学到的一样多)。但是,为什么像这样的代码:

public static void main(String[] args) {
    (...)
System.out.println("Array before sorting: "+Arrays.toString(ourArray));
System.out.println("Array after sorting: "+Arrays.toString(sortTheArray(ourArray)));
System.out.println("Bah-dum-tss: "+Arrays.toString(ourArray));

}

public static int[] sortTheArray(int[] someArray)
{
    Arrays.sort(someArray);
    return someArray;
}

为第二行和第三行产生相同的输出?我的意思是 - 如果我们只通过副本传递它,为什么不在第二个println上打印排序的数组,然后在第三个打印出相同的,未排序的数组?我没有在任何地方做任何ourArray = sortTheArray(ourArray),为什么它的价值会发生变化呢?提前谢谢你,并抱怨一个新的问题:)

5 个答案:

答案 0 :(得分:4)

Java不传递整个数组的副本,它传递数组引用的值。因此,应用程序中只有一个数组实例,并且该实例得到了排序。

答案 1 :(得分:2)

简短的回答是:因为你的书错了。 Java是按值传递的。 在这种情况下,“value”是对int数组的引用。此引用传递给Arrays.sort(),它将在该引用处对数组进行排序(在您的情况下,它始终是相同的。 因此,您可以使用阵列所在的位置,并且所有代码都使用相同的代码。

如果你想拥有一个真正的副本,你需要使用System.arraycopy()来生成一个新的数组,然后你可以修改它而不需要改变原来的数组。

答案 2 :(得分:1)

复制参数ourArray,因此对同一个数组有多个引用。使用引用的一个副本修改数组,并通过另一个引用显示更改。 ourArray不会更改并继续指向与之前相同的数组。

答案 3 :(得分:1)

您传递了参考的副本,该副本指向该对象。

这意味着

 public void myMethod(Set<String> a)

然后

 myClass.myMethod(b);

bmyMethod's a都将具有相同的值,即对同一对象的引用。

答案 4 :(得分:0)

这很有可能发生,因为sortTheArray方法正在修改它所操作的对象。如果你熟悉ruby,你可能已经注意到某些方法有一个尾随感叹号。这意味着该方法将修改它所调用的对象。