Java 路过副本的新手感到困惑
所以我知道Java是一种间接复制语言(至少和我从书中学到的一样多)。但是,为什么这样的代码:Java 路过副本的新手感到困惑,java,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
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上打印排序的数组,然后在第三个println上打印相同的、未排序的数组?我在任何地方都不做任何ourArray=sortTheArray(ourArray),那么它的值为什么会改变呢?提前感谢您,并为一个新问题感到抱歉:)Java不会传递整个数组的副本,而是传递数组引用的值。因此,应用程序中只有一个数组实例,并且该实例已排序。这很可能发生,因为方法sortTheArray正在修改它所操作的对象。如果您熟悉ruby,您可能已经注意到一些方法后面有一个感叹号。这意味着该方法将修改它所调用的对象。参数
ourArray
被复制,因此对同一数组有多个引用。使用引用的一个副本修改数组,并且可以通过另一个引用看到更改ourArray
不会更改,并继续指向与以前相同的数组。您将传递一个指向对象的引用副本
这意味着
public void myMethod(Set<String> a)
b
和myMethod的a
将具有相同的值,即对同一对象的引用。简短的回答是:因为你的书错了。
Java是按值传递的。
在本例中,“值”是对int数组的引用。此引用被传递到Arrays.sort()中,它将在该引用处对数组进行排序(在您的示例中,该引用始终是相同的)。
因此,您的数组位于同一个位置,并且所有代码都使用相同的数组
如果你想要一个真实的副本,你需要使用System.arraycopy()生成一个新的数组,然后你可以在不改变原始数组的情况下对其进行修改。这个答案可能会帮助你:我一定会阅读它。非常感谢!
myClass.myMethod(b);