2012-03-22 9 views
1

私はオブジェクトをクローンし、新しいクローンオブジェクトのメンバー機能を変更しようとしました。それが浅いコピーで、wikiページに従って、浅いコピーと元のオブジェクトが同じオブジェクトを指している場合は、変数値を変更する必要があります。オブジェクトクローン浅いコピーは変数を変更しません

CloneExample obj1=new CloneExample(); 
    CloneExample obj2=(CloneExample) obj1.clone(); 
    obj1.a=2; 
    obj1.c='a'; 
    System.out.println("obj1 real "+obj1.a+" "+obj1.c); 
    System.out.println("obj2 real "+obj2.a+" "+obj2.c); 
    obj2.a=99; 
    obj2.c='z'; 
    System.out.println("obj2 after change "+obj2.a+" "+obj2.c); 
    System.out.println("obj1 after change "+obj1.a+" "+obj1.c); 
    System.out.println("obj1="+obj1+" obj2="+obj2); 

このクローンはOBJ2は、OBJ1に反映すべき変更すること、そして、同じ参照OBJにOBJ2とObj1とポイント浅いコピーである場合。それは起こりません。誰でも説明することができます(私はクローンが私たちにオブジェクトのコピーを与えるように設計されていると理解していますが、それが浅いコピーの場合はなぜ浅いコピーが必要なのですか? ありがとうございます。

答えて

0

あなたは()object.cloneを呼び出すと、新しいオブジェクトが作成されます。結果として、このオブジェクトへの参照を取得します。プリミティブ型フィールドのみを持つオブジェクトは完全にクローニングされます。結果として、obj1のコピーから完全に独立したものになります。しかし、オブジェクトに参照があるフィールドがある場合は、深いクローンを行う必要があります。

+1

変更可能なオブジェクトを参照する参照フィールドを詳細に複製する必要があります。たとえば、Stringフィールドは参照ですが、深く複製する必要はありません。 –

3

なぜクローンは浅いコピーだと思いますか?ここをクリックしてください:http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#clone()

つまり、どのようなクローンは実装に依存しますか。また、「シャローコピー」は単に同じオブジェクトへの新しい参照を作成するだけではなく、一般に、コピーされたオブジェクトと同じ内部メンバーで新しいインスタンスが作成されることを意味します。しかし、新しいobjのメンバ変数を新しいものを指すように変更すると、元のobjのメンバ変数は変更されません。

3

obj1の浅いコピーは、別のインスタンスCloneExampleクラス(obj1!= obj2)の obj2を作成します。 彼らはバリュー会員を共有していません。

しかし、私たちのクラスにリファレンスタイプ(例えばjava.util.Date)が含まれている場合、その値を変更すると、そのオブジェクトがjava.util.Dateへの参照を共有する場合、両方のオブジェクトに反映されます。

In Java, what is a shallow copy?

+1

'java.lang.Integer'は不可能な悪い例です。 'java.util.Date'と考えてください。 – madth3

+0

@ madth3そうだね、それを指摘してくれてありがとう! – surfen

関連する問題