English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
このクローン() Cloneableインターフェースを実装したクラスのオブジェクトのコピーを作成するために使用されます。デフォルトでは、 インターフェース。フィールドごとにコピーされます。 Objectクラスは特定のクラスのメンバがこのメソッドを呼び出す際に、そのクラスのメンバについて何も知りません。したがって、クラスに原始データ型のメンバしかない場合、オブジェクトの新しいコピーが作成され、その新しいオブジェクトコピーへの参照が返されます。しかし、クラスにクラス型のメンバが含まれている場合、そのメンバのオブジェクト参照のみがコピーされ、したがって、元のオブジェクトとクローンオブジェクトのメンバ参照は同じオブジェクトを参照します。
クローンしようとすると、未実装の Cloneableclone()インターフェースを実装したクラスのオブジェクト上で呼び出すと、メソッドを実行すると、 CloneNotSupportedExceptionこのインターフェースはマークインターフェースです。このインターフェースObject.clone()実装は、実装クラスのオブジェクト上で呼び出すことができることを示しています。
この
protected Object clone() throws CloneNotSupportedExceptionclone()
このメソッドを実現する方法は二つあります。
このクラスも非基本データ型のメンバーを持っている場合、これはObject.clone()メソッドが提供するデフォルトのクローン機能の結果は、"浅いコピー"の状況では、クローンされたオブジェクトが元のオブジェクトが参照する同じオブジェクトを参照し、オブジェクトの参照のみをコピーし、オブジェクトを参照しないためです。
public class ShallowCopyTest { public static void main(String args[]) { A a1 = new A(); A a2 = (A) a1.clone(); a1.sb.append("w3codebox!"); System.out.println(a1); System.out.println(a2); } } class A implements Cloneable { public StringBuffer sb = new StringBuffer("Welcome to "); public String toString() { return sb.toString(); } public Object clone() { try { return super.clone(); } catch(CloneNotSupportedException e) { } return null; } }
出力結果
Welcome to w3codebox! Welcome to w3codebox!
非基本データ型のメンバーを持つクラスに対して、このメソッドをオーバーライドする必要があります。clone() メソッドを用いて実現深いコピー(Deep Copy),それもまたメンバーオブジェクトをクローンする必要があり、デフォルトのクローンメカニズムではこのことを実現できません。
public class DeepCopyTest { public static void main(String args[]) { A a1 = new A(); A a2 = (A) a1.clone(); a1.sb.append(" w3codebox!"); System.out.println(a1); System.out.println(a2); } } class A implements Cloneable { public StringBuffer sb = new StringBuffer("Welcome to "); public String toString() { return sb.toString(); } public Object clone() { try { A a = (A) super.clone(); a.sb = new StringBuffer(sb.toString()); return a; } catch(CloneNotSupportedException e) { } return null; } }
出力結果
Welcome to w3codebox! Welcome to