所以我认为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),为什么它的价值会发生变化呢?提前谢谢你,并抱怨一个新的问题:)
答案 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);
b
和myMethod's a
都将具有相同的值,即对同一对象的引用。
答案 4 :(得分:0)
这很有可能发生,因为sortTheArray方法正在修改它所操作的对象。如果你熟悉ruby,你可能已经注意到某些方法有一个尾随感叹号。这意味着该方法将修改它所调用的对象。