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;
}

2 行目と 3 行目で同じ出力を生成しますか? つまり、コピーのみで渡す場合、ソートされた配列を 2 番目の println に出力してから、同じソートされていない配列を 3 番目に出力しないのはなぜですか? ourArray = sortTheArray(ourArray) をどこにも行っていないのに、なぜその値が変わるのですか? よろしくお願いします。初心者の質問で申し訳ありません:)

4

5 に答える 5

4

Java は配列全体のコピーを渡すのではなく、配列の参照の値を渡します。したがって、アプリケーションには配列のインスタンスが 1 つしかなく、そのインスタンスはソートされます。

于 2012-11-25T22:00:16.050 に答える
2

簡単に言えば、あなたの本が間違っているからです。Javaは値渡しです。この場合、「値」は int 配列への参照です。この参照は Arrays.sort() に渡され、その参照で配列をソートします(あなたの場合は常に同じです。したがって、配列がある場所にあり、すべてのコードがまったく同じものを使用します。

実際のコピーが必要な場合は、 System.arraycopy() を使用して新しい配列を作成する必要があります。この配列は、元の配列を変更せずに変更できます。

于 2012-11-25T22:01:42.707 に答える
1

パラメータourArrayがコピーされるため、同じ配列への複数の参照があります。配列は参照の 1 つのコピーを使用して変更され、変更は他の参照を介して表示されます。ourArray変更されず、以前と同じ配列を指し続けます。

于 2012-11-25T22:01:27.893 に答える
1

オブジェクトを指す参照のコピーを渡します。

この意味は

 public void myMethod(Set<String> a)

それから

 myClass.myMethod(b);

bとの両方myMethod's aが同じ値 (同じオブジェクトへの参照) を持ちます。

于 2012-11-25T22:01:37.690 に答える
0

これは、メソッド sortTheArray が操作対象のオブジェクトを変更しているために発生する可能性が最も高いです。Ruby に精通している場合は、いくつかのメソッドの末尾に感嘆符があることに気付いたかもしれません。これは、メソッドが呼び出されたオブジェクトを変更することを意味します。

于 2012-11-25T22:01:07.767 に答える