あるオブジェクトの参照を別のオブジェクトにコピーするには、3 つの方法があります。 1 つ目は直接割り当て、2 つ目はシャロー コピー、3 つ目はディープ コピーです。
1. 直接割り当て
Java では、A a1 = a2 となり、これは実際に参照をコピーします。つまり、a1 と a2 は次のポイントを指します。同じオブジェクトです。したがって、a1 が変更されると、a2 のメンバー変数も変更されます。
2. 浅いコピー (参照をコピーしますが、参照されるオブジェクトはコピーしません)
浅いコピー。浅いコピーとも呼ばれます。新しいオブジェクトを作成し、現在のオブジェクトの非静的フィールドを新しいオブジェクトにコピーします。フィールドが値型の場合は、フィールドをコピーします。フィールドが参照型の場合は、参照をコピーしますが、参照されるフィールドはコピーしません。物体。したがって、元のオブジェクトとそのコピーは同じオブジェクトを参照します。
(推奨ビデオ: java ビデオ チュートリアル )
class Resume implements Cloneable{ public Object clone() { try { return (Resume)super.clone(); } catch (Exception e) { e.printStackTrace(); return null; } } }
3. ディープ コピー (オブジェクトとその参照オブジェクトをコピー)
ディープ コピーとも呼ばれ、オブジェクト自体をコピーするだけでなく、オブジェクトに含まれる参照が指すすべてのオブジェクトもコピーします。
class Student implements Cloneable { String name; int age; Professor p; Student(String name, int age, Professor p) { this.name = name; this.age = age; this.p = p; } public Object clone() { Student o = null; try { o = (Student) super.clone(); } catch (CloneNotSupportedException e) { System.out.println(e.toString()); } o.p = (Professor) p.clone(); return o; } }
clone() メソッドを使用してオブジェクトのクローンを作成する手順:
1) クローン作成されたクラスは、Cloneable インターフェイスを実装する必要があります。
2) クローン化されたクラスは clone() メソッドをオーバーライドする必要があります。
それでは、プログラミング時に使用するコピー方法をどのように選択すればよいのでしょうか?まず、クラスで非基本型 (つまり、オブジェクト) のデータ メンバーがチェックされます。そうでない場合は、super.clone() を返します。その場合は、クラスに含まれるすべての非基本型メンバー変数がディープ コピーを実装していることを確認してください。
拡張: 浅いコピーと深いコピーの違いは何ですか?
浅いクローン: コピーされたオブジェクトのすべての変数には元のオブジェクトと同じ値が含まれており、他のすべてのオブジェクトへの参照は引き続き元のオブジェクトを指します。つまり、浅いコピーは、参照しているオブジェクトではなく、問題のオブジェクトのみをコピーします。
ディープ クローン: コピーされたオブジェクトのすべての変数には、他のオブジェクトを参照する変数を除き、元のオブジェクトと同じ値が含まれます。他のオブジェクトを参照する変数は、元の参照オブジェクトではなく、コピーされる新しいオブジェクトを指します。つまり、ディープ コピーは、コピーされたオブジェクトによって参照されるすべてのオブジェクトをコピーします。
拡張機能:
プロトタイプ モードは主にオブジェクトのコピーに使用され、インターフェイスを実装し (Cloneable インターフェイスを実装)、メソッドをオーバーライドします (オブジェクト内のクローンをオーバーライドします)。 class()メソッド)、つまりプロトタイプモードが完了します。
プロトタイプ モードでのコピーは、「浅いコピー」と「深いコピー」に分かれています。
浅いコピー: 値型のメンバー変数の値をコピーします。参照型のメンバー変数は参照のみをコピーし、参照されるオブジェクトはコピーしません。
Copy: 値型のメンバ変数の値をコピーし、参照型のメンバ変数の参照オブジェクトをコピーします。
(Object クラスの clone メソッドは、オブジェクト内の基本データ型の値のみをコピーします。配列、コンテナ オブジェクト、参照オブジェクトなどはコピーされません。これは浅いコピーです。ディープ コピーを実装するには、プロトタイプ モードで配列、コンテナ オブジェクト、参照オブジェクトなどを個別にコピーする必要があります。)
プロトタイプ モードの利点:
1.新しいオブジェクトの作成がより複雑な場合は、プロトタイプ パターンを使用してオブジェクトの作成プロセスを簡素化できます。
2. Object クラスの clone メソッドはローカル メソッドであり、バイナリ ストリームを直接操作するため、常にオブジェクトを作成するモードであり、オブジェクトを直接新規作成するよりもパフォーマンスがはるかに優れています。メモリ、特に大規模なコピー オブジェクトを使用する場合、パフォーマンスの違いは非常に明白です。
プロトタイプ パターンの使用シナリオ:
上記の利点があるため、同様のオブジェクトを繰り返し作成する必要がある場合は、プロトタイプ パターンの使用を検討できます。 。たとえば、ループ内でオブジェクトを作成する必要がある場合、オブジェクト作成プロセスが複雑であるかループが多い場合、プロトタイプ パターンを使用すると、作成プロセスが簡素化されるだけでなく、システム全体のパフォーマンスも大幅に向上します。
この記事は、php 中国語 Web サイトの java チュートリアル 列からのものです。学習へようこそ!
以上がJavaの「浅いコピー」と「深いコピー」の違いと実装(コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于平衡二叉树(AVL树)的相关知识,AVL树本质上是带了平衡功能的二叉查找树,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于Java的相关知识,其中主要整理了Stream流的概念和使用的相关问题,包括了Stream流的概念、Stream流的获取、Stream流的常用方法等等内容,下面一起来看一下,希望对大家有帮助。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック



