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