Cloneable はタグ付きインターフェイス (空のインターフェイス) です。内部メソッドやプロパティはありません。オブジェクトがクローン可能であることを示すために Cloneable を実装します。, Object.clone() メソッドを使用できます。 Cloneable を実装していないクラス オブジェクトが clone() を呼び出すと、CloneNotSupportedException がスローされます。
Cloneable インターフェイスがマーキング機能を果たしていることがわかります。カスタム タイプでは、ユーザーがどのクラスをクローンできるかをマークする必要があります。このマークは、Cloneable インターフェイスを実装し、 Cloneable インターフェイスを追加すると、このクラスによって作成されたオブジェクトのクローンを作成できることが示されます。
クラスにインスタンスをコピーする機能を持たせたい場合は、Cloneable インターフェイスの実装に加えて、Object クラスの clone() メソッドもオーバーライドする必要があります。
Object クラスの clone() メソッドが protected によって変更されていることがわかります。そのため、オーバーライドされた 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); } }
実行結果:
シャローコピーの図:
次のコードはディープ コピーを実装しています。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); } }
実行結果:
ディープコピーの図:
4. クローンメソッドの概要
以上がJava ディープ コピー、シャロー コピー、および Cloneable インターフェイスの使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。