Object.clone

Object.cloneは、オブジェクトのコピーを作成して返す。

Object (Java Platform SE 6)
オブジェクトのクローン - Java の基本 - Java 入門

派生クラスで、Cloneableインターフェースのcloneを実装して、オーバーライドしないといけない。

// カスタムオブジェクト
class CustomObject {	// Objectの派生クラスCustomObject

	// フィールド
	String str;	// Stringクラスフィールドstr.
	int value;	// int型フィールドvalue.

	// メソッド
	public void setStr(String str) {	// strをセットするメソッドsetStr.
		this.str = str;	// メンバに引数をセット.
	}
	public void setValue(int value) {	// valueをセットするメソッドsetValue.
		this.value = value;	// メンバに引数をセット.
	}
	@Override
	public String toString(){	// オーバーライドメソッドtoString.
		String retStr = "CustomObject[str = " + str + ", " + "value = " + value + "]";	// retStrにメンバフィールドの値をセット.
		return retStr;	// retStrを返す.
	}

}

前回のCustomObjectのようなメンバフィールドを持つクラスで、

//メインクラス
class MainClass {	// MainClassクラスの定義

	// Javaのエントリポイント
	public static void main(String[] args) {	// mainメソッドの定義

		// CustomObjectを1つ生成.
		CustomObject obj1 = new CustomObject();	// CustomObjectオブジェクトobj1を生成.

		// 文字列をセット.
		obj1.setStr("ABC");	// obj1.setStrで"ABC"をセット.

		// 整数値をセット.
		obj1.setValue(123);	// obj1.setValueで123をセット.

		// obj1の中身を出力.
		System.out.println("obj1.toString() = " + obj1.toString());	// obj1.toString()を出力.

		// CustomObjectオブジェクトをもうひとつ用意.
		CustomObject obj2;	// obj2を用意.

		// 代入
		obj2 = obj1;	// obj2にobj1を代入.(参照渡しになる.)

		// obj2の内容を変更.
		obj2.setStr("XYZ");	// obj2.setStrで"XYZ"をセット.
		obj2.setValue(789);	// obj2.setValueで789をセット.

		// obj2の中身を出力.
		System.out.println("obj2.toString() = " + obj2.toString());	// obj2.toString()を出力.

		// obj1の中身を出力.
		System.out.println("obj1.toString() = " + obj1.toString());	// obj1.toString()を出力.

	}

}

obj2に代入するという場合、Javaは参照渡しなので、データコピーされるわけではない。

obj1.toString() = CustomObject[str = ABC, value = 123]
obj2.toString() = CustomObject[str = XYZ, value = 789]
obj1.toString() = CustomObject[str = XYZ, value = 789]

このように、obj2で変更した内容がobj1にも反映される。おなじオブジェクトを参照しているからである。

Cloneableを継承し、cloneでsuper.clone(つまりObject.clone)を呼ぶ。

Cloneable (Java Platform SE 6)

という感じで、cloneにすると、

obj1.toString() = CustomObject[str = ABC, value = 123]
obj2.toString() = CustomObject[str = XYZ, value = 789]
obj1.toString() = CustomObject[str = ABC, value = 123]

obj2の変更がobj1には影響しない。別のオブジェクトだからである。

Sample/java/Object/clone/src/Object at master · bg1bgst333/Sample · GitHub