ホームページ >Java >&#&チュートリアル >Java ディープ コピー、シャロー コピー、および Cloneable インターフェイスの使用方法

Java ディープ コピー、シャロー コピー、および Cloneable インターフェイスの使用方法

PHPz
PHPz転載
2023-04-28 20:31:051312ブラウズ

1. Cloneable インターフェイスの概要

Cloneable はタグ付きインターフェイス (空のインターフェイス) です。内部メソッドやプロパティはありません。オブジェクトがクローン可能であることを示すために Cloneable を実装します。, Object.clone() メソッドを使用できます。 Cloneable を実装していないクラス オブジェクトが clone() を呼び出すと、CloneNotSupportedException がスローされます。

Java ディープ コピー、シャロー コピー、および Cloneable インターフェイスの使用方法

Cloneable インターフェイスがマーキング機能を果たしていることがわかります。カスタム タイプでは、ユーザーがどのクラスをクローンできるかをマークする必要があります。このマークは、Cloneable インターフェイスを実装し、 Cloneable インターフェイスを追加すると、このクラスによって作成されたオブジェクトのクローンを作成できることが示されます。

クラスにインスタンスをコピーする機能を持たせたい場合は、Cloneable インターフェイスの実装に加えて、Object クラスの clone() メソッドもオーバーライドする必要があります。

Java ディープ コピー、シャロー コピー、および Cloneable インターフェイスの使用方法

Object クラスの clone() メソッドが protected によって変更されていることがわかります。そのため、オーバーライドされた clone( ) メソッド。

Java ディープ コピー、シャロー コピー、および Cloneable インターフェイスの使用方法

2 の clone() メソッド。浅いコピーの概要と例

オブジェクトをコピーする場合、オブジェクトの基本的なメンバー変数コピーは実行されますが、参照型のメンバー変数には参照のみが渡され、新しいオブジェクトは作成されません。 参照型の内容が変更されると、コピーされたオブジェクトに影響します。要約すると: 浅いコピーは、コピー対象のオブジェクトのみをコピーし、それが参照するオブジェクトはコピーしません。

次のコードを観察し、Money クラスのインスタンスを person クラスのフィールドとして使用し、person クラスの新しいオブジェクト person1 を作成し、person1 オブジェクトを person2 にコピーします。これは浅いコピーで、 person1 オブジェクトの Money 参照を person2 にコピーするだけで、 person1 と person2 の momey は同じオブジェクトを指します。

class Money {
    public double m = 666;
}
class Person implements Cloneable{
    int id;
    public Money money = new Money();

    public Person(int id) {
        this.id = id;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", money=" + money.m +
                '}';
    }
}
public class TestDemo3 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1 = new Person(1);
        Person person2 = (Person) person1.clone();

        System.out.println("通过person2修改前的结果");
        System.out.println(person1);
        System.out.println(person2);

        person2.money.m = 888;
        person2.id = 2;
        System.out.println("通过person2修改后的结果");
        System.out.println(person1);
        System.out.println(person2);
    }
}

実行結果:

Java ディープ コピー、シャロー コピー、および Cloneable インターフェイスの使用方法

シャローコピーの図:

Java ディープ コピー、シャロー コピー、および Cloneable インターフェイスの使用方法

3. ディープコピーの概要オブジェクトをコピーする場合、基本データ型のメンバ変数をコピーするだけでなく、参照型のメンバ変数をコピーする場合も、新しいオブジェクトを作成して参照型のメンバ変数を保存します。要約すると:

ディープ コピーは、コピーされるオブジェクトによって参照されるすべてのオブジェクトをコピーします。

次のコードはディープ コピーを実装しています。person1 オブジェクトのディープ コピーを実装するには、まず Person tmp 参照を使用してシャロー コピーの結果を保存し、tmp 参照を通じて Money オブジェクトを見つけて、次に Money をコピーします。 object を取得し、それを tmp 内のmoneyに割り当て、最後に tmp を返します。このように、moneyが参照するオブジェクトもコピーされ、ディープコピーが実現されるのですが、このときperson1とperson2のmomeyは2つの異なるオブジェクトを指しています。

class Money implements Cloneable{
    public double m = 666;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

}

class Person implements Cloneable{
    public int id;
    public Money money = new Money();

    public Person(int id) {
        this.id = id;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        //return super.clone();
        Person tmp = (Person) super.clone();
        tmp.money = (Money) this.money.clone();
        return tmp;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", money=" + money.m +
                '}';
    }
}
public class Test2 {
    public static void main(String[] args) throws CloneNotSupportedException{
        Person person1 = new Person(1);
        Person person2 = (Person) person1.clone();

        System.out.println("通过person2修改前的结果");
        System.out.println(person1);
        System.out.println(person2);

        person2.money.m = 888;
        person2.id = 2;
        System.out.println("通过person2修改后的结果");
        System.out.println(person1);
        System.out.println(person2);
    }
}

実行結果:

Java ディープ コピー、シャロー コピー、および Cloneable インターフェイスの使用方法ディープコピーの図:

Java ディープ コピー、シャロー コピー、および Cloneable インターフェイスの使用方法4. クローンメソッドの概要

Java の clone メソッドは浅いコピーであり、参照型は引き続き参照を渡します。 clone() メソッドの呼び出しを続け、オブジェクトの参照型変数に対して clone() メソッドを再度実装することで、ディープ コピーを実装できます。

以上がJava ディープ コピー、シャロー コピー、および Cloneable インターフェイスの使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。