1

クラスabcの2つのオブジェクトがあるとしましょう

abc obj = new abc(10,20);// 2 つの var の値を設定します。x と y と言う

abc obj1 = obj; // 同じメモリを指しているので同じ値

しかし、あるオブジェクトの値を別のオブジェクトに割り当てる方法があれば、両方とも diff があります。メモリー。アドレスではなく値をコピーしたいだけです。どんなオペレーターか何かがそれを行うことができますか?

4

7 に答える 7

3

メソッドを使用できますclone()(サブクラスがjava.lang.Cloneableインターフェースを実装していると仮定します)

abc obj1 = obj.clone()

のデフォルトの動作はclone()、オブジェクトの浅いコピーを返すことに注意してください。これは、元のオブジェクトのすべてのフィールドの値が新しいオブジェクトのフィールドにコピーされることを意味します (他のオブジェクトのグラフ全体を通過するわけではありません)。

シリアル化および逆シリアル化できるオブジェクトを「ディープコピー」したいと思います。

ディープ コピーは、オブジェクトの各フィールドの個別のコピーを作成し、コピーされるオブジェクトによって参照される他のオブジェクトのグラフ全体を再帰します。

詳細:

http://javatechniques.com/blog/faster-deep-copies-of-Java-objects/

于 2012-07-19T10:52:09.603 に答える
2

clone() メソッドを使用する場合、Cloneable インターフェイスを実装し、このメソッドの独自の実装を作成する必要があります。クラスにコピーコンストラクタを作って使ったほうがいいと思います。

例えば:

public class YourClass() {
     private int prop1;
     private int prop2;
     ...
     // Getters and setters for properties.
     ...

     // Default constructor
     public YourClass() {
     }

     // Copy constructor
     public YourClass(YourClass instance) {
         this.prop1 = instance.getProp1();
         this.prop2 = instance.getProp2();
         // The same for other methods
     }

}

これは、StackOverflowの複製とコピー コストラクタとファクトリ メソッドに関する良い投稿です。

于 2012-07-19T10:57:57.027 に答える
1

「演算子のオーバーロード」を使用してみてください。私は知っています、私は知っています、Javaにはそれがありませんが、それはあなたがそれを「使う」ことを止めるものではありません。

あなたがする必要があるのは、次のとおりです。

obj1.copy(obj2);

そして abc の宣言の中で

public void copy(abc other) {
    var1 = other.var1;
    var2 = other.var2;
}

これは単なる記憶によるものであり、テストされていないことを強調したいと思いますが、機能しない理由はわかりません。

別の方法として、「clone()」を使用できますが、クラス内の「参照」が複製されることに注意してください。手動でやったほうがいいです、本当に。

「コピー」を上書きすることで、サブクラスが正しくコピーされていることを確認することもできます。

于 2012-07-19T10:55:55.027 に答える
1

Object クラスの clone メソッドを使用します。

MyClass mobj = new MyClass("Vivek");

MyClass mobj1 = mobj.clone();

しかし、ディープクローニングのために使用してみてくださいSerialization and Deserialization

于 2012-07-19T10:56:49.357 に答える
1

clone メソッドを使用する必要があります。クローンのデフォルトの動作はシャロー コピーです。

于 2012-07-19T11:19:36.520 に答える
1

ディープ クローニング使用します。クラスにCloneable Interfaceabcを実装し、実装します。clone()

 abc obj = new abc(10,20); // setting the values of two var. say x and y

 abc obj1 = obj.clone();

Cloningクラス構造によって異なります。以下の例のような単純なクラスを検討する場合。

 class ABC implements Cloneable {

private int a;
private int b;

public int getA() {
    return a;
}

public ABC(int a, int b) {
    super();
    this.a = a;
    this.b = b;
}

public void setA(int a) {
    this.a = a;
}

public int getB() {
    return b;
}

public void setB(int b) {
    this.b = b;
}

@Override
protected Object clone() throws CloneNotSupportedException {
    // TODO Auto-generated method stub
    return super.clone();
}
}

メインでテストするとfalseが返されます。

public static void main(String[] args) throws CloneNotSupportedException {

    ABC a = new ABC(1, 2);

    ABC b = (ABC) a.clone();

    System.out.println(a == b);
}
于 2012-07-19T10:51:36.953 に答える
1

新しいオブジェクトを構築する必要があります。他の人が指摘しているように、Cloneableandを実装することでこれを達成できclone()ますが、元のオブジェクトが保持するデータから新しいオブジェクトを作成するコンストラクターまたはファクトリ メソッドを実装することで、新しいオブジェクトを明示的に作成することもできます。

実装に大きな違いはありませんが、明示的なインスタンス化の方がエラーが発生しにくいことがわかります。

Josh Bloch は、Effective Java でこれについて詳しくコメントしています。版によっては、第 3 章の項目 10または項目 11 です。

于 2012-07-19T10:54:17.273 に答える