0

所以我知道 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) 那么为什么它的值会改变?提前谢谢你,很抱歉提出一个新问题:)

4

5 回答 5

4

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

于 2012-11-25T22:00:16.050 回答
2

简短的回答是:因为你的书是错的。Java 是按值传递的。在这种情况下,“值”是对 int 数组的引用。这个引用被传递到 Arrays.sort() 中,它将在那个引用处对数组进行排序(在你的情况下总是相同的。所以你有你的数组所在的位置,并且你的所有代码都使用同一个。

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

于 2012-11-25T22:01:42.707 回答
1

参数ourArray被复制,因此对同一个数组有多个引用。使用引用的一个副本修改数组,并且通过另一个引用可以看到更改。ourArray不会改变并继续指向与以前相同的数组。

于 2012-11-25T22:01:27.893 回答
1

您传递了reference的副本,它指向该对象。

这意味着

 public void myMethod(Set<String> a)

然后

 myClass.myMethod(b);

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

于 2012-11-25T22:01:37.690 回答
0

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

于 2012-11-25T22:01:07.767 回答