5

のドキュメントObject#clone()から:

すべての配列がインターフェイスを実装すると見なされることに注意してくださいCloneable。それ以外の場合、このメソッドはこのオブジェクトのクラスの新しいインスタンスを作成し、割り当てによるかのように、このオブジェクトの対応するフィールドの内容を正確に使用してすべてのフィールドを初期化します。フィールドの内容自体は複製されません。したがって、このメソッドは、「ディープ コピー」操作ではなく、このオブジェクトの「浅いコピー」を実行します。

しかし、のドキュメントjava.util.Arraysはそれを示していませんArrays implements Cloneable

配列はどのように実装しCloneableますか?

4

2 に答える 2

5

あなたは紛らわしいですjava.util.Arrays、配列を操作するメソッドを含む通常のクラス、および配列自体は、Java言語ではかなり特別な構造ですが、それでも合成クラスを持つオブジェクトです。を実装するのがこのクラスですCloneable。また、 から直接派生しObjectます。この件についてはかなり明確な配列に関するJLSページを見てください。

たとえば、次のコードを見てください (前述の JLS から取得)。

class Test {
    public static void main(String[] args) {
        int[] ia = new int[3];
        System.out.println(ia.getClass());
        System.out.println(ia.getClass().getSuperclass());
    }
}

これは印刷されます:

class [I
class java.lang.Object
于 2013-11-08T06:24:10.567 に答える
5

java.util.ArraysJava 配列で動作するユーティリティを含むクラスであり、配列自体と混同しないでください。

配列は、1 つの型の固定数の値を保持するコンテナー オブジェクトです。これらは、Java 言語で明示的に定義された特別なタイプのオブジェクトです。すべての Java 配列は and を実装java.lang.Cloneableしてjava.io.Serializableいます。

java.util.Arrays一方、 はこれらのインターフェイスを実装せず、配列に対して実行される一般的な関数を実装する静的メソッドのみを提供します。

などの 1 次元配列を複製するObject[]と、参照ではなく、元の配列の要素のコピーを含む新しい配列で「ディープ コピー」が実行されます。

ただし、多次元配列のクローン ( などObject[][]) は「浅いコピー」です。つまり、各要素配列が元の要素配列への参照を持つ新しい配列を 1 つだけ作成します。

于 2013-11-08T06:24:39.020 に答える