検索
ホームページJava&#&チュートリアルJava Cloneable インターフェイスのディープ コピーおよびシャロー コピー メソッド

    クローン可能なインターフェイスのソース コード

    クローン可能なインターフェイス:

    このインターフェイスを実装するクラスは次のとおりです。 java.lang.Object の clone() メソッドは、クラス インスタンス、つまりプロパティ間のコピーを実装するために、合法的に呼び出すことができると推測されます。

    クラスが Cloneable インターフェイスを実装していない場合、 clone() メソッドが呼び出されるときに、CloneNotSupportedException 例外がスローされます。

    一般に、Cloneable インターフェースを実装する サブクラスは、パブリック アクセス許可を持つ clone() メソッド をオーバーライドする必要があります (ただし、java.Object クラスの clone メソッドは保護された型です)

    Cloneable インターフェイスには clone() メソッドが含まれていないことに注意してください。したがって、Cloneable インターフェイスを実装しただけでは、オブジェクトを正常に複製することはできません。

    [理由:リフレクティブに呼び出したとしても、クローン作成メソッドが成功する保証はありません] - 私の個人的な理解は次のとおりです。 Clone() メソッドをオーバーライドするかどうか、または「浅いコピーとコピー」の存在が原因です。ディープコピー」の問題。

    class Pet implements Cloneable{
        //properties
        private String name;
        public void setName(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
        public Pet() {
        }
        public Pet(String name) {
            this.name = name;
        }
        @Override
        public String toString() {
            return "Pet{" +
                    "name='" + name + '\'' +
                    '}';
        }
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Pet pet = (Pet) o;
            return Objects.equals(name, pet.name);
        }
        @Override
        public int hashCode() {
            return Objects.hash(name);
        }
    //    @Override
    //    public Pet clone() {
    //        try {
    //            return (Pet)super.clone();
    //        } catch (CloneNotSupportedException e) {
    //            e.printStackTrace();
    //        }
    //        return null;
    //    }
    }

    浅いコピーの場合

    Pet クラス定義

    注: Pet クラスは Cloneable インターフェイスを実装しますが、Clone() メソッドをオーバーライドしません (明らかに:この Pet クラスにはオブジェクトのクローンを作成する機能がありません)。

    class Pet implements Cloneable{
        //properties
        private String name;
        public void setName(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
        public Pet() {
        }
        public Pet(String name) {
            this.name = name;
        }
        @Override
        public String toString() {
            return "Pet{" +
                    "name='" + name + '\'' +
                    '}';
        }
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Pet pet = (Pet) o;
            return Objects.equals(name, pet.name);
        }
        @Override
        public int hashCode() {
            return Objects.hash(name);
        }
    //    @Override
    //    public Pet clone() {
    //        try {
    //            return (Pet)super.clone();
    //        } catch (CloneNotSupportedException e) {
    //            e.printStackTrace();
    //        }
    //        return null;
    //    }
    }

    パーソン クラス定義

    注: パーソン クラスは Cloneable インターフェイスを実装し、Clone() メソッドもオーバーライドします。では、 Person クラスにはオブジェクトのクローンを作成する機能があるのでしょうか? (浅いコピーの問題により、このオブジェクトのクローン作成機能は不完全で欠陥があると考えられます)。

    class Pet implements Cloneable{
        //properties
        private String name;
        public void setName(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
        public Pet() {
        }
        public Pet(String name) {
            this.name = name;
        }
        @Override
        public String toString() {
            return "Pet{" +
                    "name='" + name + '\'' +
                    '}';
        }
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Pet pet = (Pet) o;
            return Objects.equals(name, pet.name);
        }
        @Override
        public int hashCode() {
            return Objects.hash(name);
        }
    //    @Override
    //    public Pet clone() {
    //        try {
    //            return (Pet)super.clone();
    //        } catch (CloneNotSupportedException e) {
    //            e.printStackTrace();
    //        }
    //        return null;
    //    }
    }

    シャロー コピーの問題コード テスト

    現時点で、Person クラスのオブジェクト クローン作成機能が不完全で欠陥があると言われているのはなぜですか?現時点では、 Person オブジェクトを通じて clone() メソッドが呼び出され、オブジェクトが複製されると、そのメンバー属性 pet (Pet クラスのオブジェクト) の値の複製は、メモリ アドレスの単純なコピーにすぎないためです。ヒープ領域にあります。

    つまり: 率直に言うと、Person オブジェクトの pet 属性値と複製されたオブジェクトは同じヒープ領域メモリを共有します。問題は明らかです。複製されたオブジェクトの pet 属性が設定されると、元の person オブジェクトの pet 属性値に明らかに影響します。

    コードのデモは次のとおりです:

      //methods
        public static void main(String[] args) throws CloneNotSupportedException {
            testPerson();
        }
        public static void testPerson() throws CloneNotSupportedException {
            Person p=new Person("张三",14,new Pet("小黑"));
            System.out.println(p);
            Person clone = (Person)p.clone();
            System.out.println(clone);
            System.out.println(p.equals(clone));
            System.out.println(p.getPet()==clone.getPet());
            System.out.println("************");
            clone.setAge(15);
            System.out.println(p);
            System.out.println(clone);
            System.out.println(p.equals(clone));
            System.out.println("************");
            clone.getPet().setName("小黄");
            System.out.println(p);
            System.out.println(clone);
            System.out.println(p.equals(clone));
            System.out.println(p.getPet()==clone.getPet());
        }

    Java Cloneable インターフェイスのディープ コピーおよびシャロー コピー メソッド

    ディープ コピーのケース

    それでは、ディープ コピーの実装方法を説明します。コピー?鍵は、上記の場合のコードのコメント行にあります。

    Pet クラスは clone() メソッドをオーバーライドします

    Java Cloneable インターフェイスのディープ コピーおよびシャロー コピー メソッド

    Pet の clone メソッドを Person の clone() メソッドで呼び出します

    Java Cloneable インターフェイスのディープ コピーおよびシャロー コピー メソッド

    浅いコピーの問題解決 - 深いコピー コードのテスト

    テスト コードは変更されていないため、再度実行します:

    Java Cloneable インターフェイスのディープ コピーおよびシャロー コピー メソッド

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

    声明
    この記事は亿速云で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
    高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか?高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか?Mar 17, 2025 pm 05:46 PM

    この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

    適切なバージョン化と依存関係管理を備えたカスタムJavaライブラリ(JARファイル)を作成および使用するにはどうすればよいですか?適切なバージョン化と依存関係管理を備えたカスタムJavaライブラリ(JARファイル)を作成および使用するにはどうすればよいですか?Mar 17, 2025 pm 05:45 PM

    この記事では、MavenやGradleなどのツールを使用して、適切なバージョン化と依存関係管理を使用して、カスタムJavaライブラリ(JARファイル)の作成と使用について説明します。

    カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか?カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか?Mar 17, 2025 pm 05:44 PM

    この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

    キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか?キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか?Mar 17, 2025 pm 05:43 PM

    この記事では、キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPAを使用することについて説明します。潜在的な落とし穴を強調しながら、パフォーマンスを最適化するためのセットアップ、エンティティマッピング、およびベストプラクティスをカバーしています。[159文字]

    Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか?Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか?Mar 17, 2025 pm 05:35 PM

    Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します

    See all articles

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    SAP NetWeaver Server Adapter for Eclipse

    SAP NetWeaver Server Adapter for Eclipse

    Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

    AtomエディタMac版ダウンロード

    AtomエディタMac版ダウンロード

    最も人気のあるオープンソースエディター

    ZendStudio 13.5.1 Mac

    ZendStudio 13.5.1 Mac

    強力な PHP 統合開発環境

    VSCode Windows 64 ビットのダウンロード

    VSCode Windows 64 ビットのダウンロード

    Microsoft によって発売された無料で強力な IDE エディター

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境