書式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