オブジェクトのクローンを生成する-java

書式protected Object clone() throws CloneNotSupportedException

clone  オブジェクトのクローン、つまりコピーを生成します。

クローンを生成できるのはjava.lang.Clonableインターフェースを実装しているクラスのオブジェクトのみとなります。

もととなるオブジェクトのフィールドがプリミティブ型の場合には、値が完全にコピーされます。

しかし、フィールドがオブジェクトの場合、オブジェクトそのものはコピーされず、参照がコピーされるという、シャローコピーが行われます。つまり、もととなるオブジェクトのフィールドに変更があった場合には、クローンのほうでも変更が起こることになります。

完璧なコピーであるディープコピーを行うためには、cloneメソッドをオーバーライドする必要があります。

/*cloneメソッドを上書きし、オブジェクト変数をコピーします。
public class OBCloneSample{
  public static void main(string[] args){
    CopyCkass ibjCop = new CopyClass();
    /*返される型はobjectなのでcopy型にキャスト*/
    CopyClass objCln = (CopyClass) objCop.clone(); 
    System.out.println(objCln.value + "," + objCln.strMes.toString());
    /*コピー元のフィールド値を変更*/
    objCop.value = 2;
    objCop.strMes.append(",second");
    System.out.println(objCln.Value + "," + objCln.strMes.toString());
  }
}
class CopyClass implements Cloneable{
  public int value = 1;
  public StringBuffer strMes = new StringBuffer("first");
  /*cloneメソッドのオーバーライド*/
  public Object clone(){
    copyClass cpyCls = new CopyClass();
    cpyCls.value = this.value;
    cpyCls.strMes = new StringBuffer("first");
    /*シャローコピーの場合:cpyCls.String=this.String*/
    return (cpyCls);
  }
} 

実行結果

1,first                                    1,first                                   

シェアする

  • このエントリーをはてなブックマークに追加

フォローする