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

所以我知道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上打印排序的数组,然后在第三个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);