浅いコピー
プリミティブ型
プリミティブ型の値がコピーされます
参照型
メモリアドレスがコピーされるため、一方のオブジェクトがアドレスを変更すると、もう一方のオブジェクトにも影響が及びます
実装方法
- このクラスオブジェクトがコピー可能であることを示すために、Cloneable インターフェースを実装します。
- clone() メソッドをオーバーライドして、clone メソッドの例外を捕捉します。
コード例
public class CopyTest {
public static void main(String[] args) {
Person p1 = new Person(" , 2, new Car(120));
Person p2;
//
p2 = p1.clone();
}
}
class Person implements Cloneable {
private String name;
private int age;
// 対応するコンストラクタ、ゲッター、セッター・メソッドを省略する。
@Override
protected Person clone() {
Person person = null;
try {
person = (Person) (super.clone());
} catch (CloneNotSupportedException e) {
}
return person;
}
}
対応するコンストラクタ、ゲッター、セッターのメソッドは省略します。
@Override
protected Person clone() {
Person person = null;
try {
person = (Person) (super.clone());
} catch (CloneNotSupportedException e) {
}
return person;
}
}Deep copy
Basic types
コピーされた値はプリミティブ型です。
参照型
ディープコピーは新しいオブジェクトスペースを作成し、その内容をコピーします。そのため、異なるメモリスペースを指します。一方を変更しても、もう一方には影響しません。
実装方法
Apache Commons Lang 3ライブラリのSerializationUtilsクラス、
コード例
import org.apache.commons.lang3.SerializationUtils;
public class DeepCopyExample {
public static void main(String[] args) {
// オブジェクトのディープコピーを作る
Person person = new Person(" , 25);
// ディープコピーを実行する
Person copiedPerson = SerializationUtils.deepCopy(person);
// 元のオブジェクトの名前を変更する
person.setName("リ・シ");
// コピー元とコピー先のオブジェクト名を表示する
System.out.println("元のオブジェクトの名前: "+ person.getName());
System.out.println("オブジェクトの名前をコピーする: "+ copiedPerson.getName());
}
// 名前と年齢の2つの属性を持つPersonクラスを定義する。
static class Person {
private String name;
private int age;
// 対応するコンストラクタ、ゲッター、セッター・メソッドを省略する。
}
}