1. 利用 Cloneable 调用Object 中的clone 方法来实现
package com;
public class CopyTest {
public static void main(String[] args) throws CloneNotSupportedException {
A a = new A(2,"abc");
B b = new B();
b.bParam1 = 10;
b.bParam2=a;
// 克隆
B b1 = (B) b.clone();
// 修改母版对象
b.bParam1 = 11;
b.bParam2.aParam2 = "123";
System.out.println("---------打印b ---------");
System.out.println(b.bParam1);
System.out.println(b.bParam2.aParam1);
System.out.println(b.bParam2.aParam2);
System.out.println("---------打印b1 ---------");
System.out.println(b1.bParam1);
System.out.println(b1.bParam2.aParam1);
System.out.println(b1.bParam2.aParam2);
}
}
class A implements Cloneable{
public int aParam1;
public String aParam2;
public A(int aParam1,String aParam2){
this.aParam1=aParam1;
this.aParam2=aParam2;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class B implements Cloneable{
public int bParam1;
public A bParam2;
public Object clone() throws CloneNotSupportedException {
B b = (B)super.clone();
b.bParam2 = (A) bParam2.clone();
return b;
}
}
结果
2. 利用Serialization 序列化实现深复制
package com;
import java.io.*;
public class CopyTest {
public static void main(String[] args) throws Exception {
A a = new A(2,"abc");
B b = new B();
b.bParam1 = 10;
b.bParam2=a;
// 克隆
B b1 = (B) b.cloneObj();
// 修改母版对象
b.bParam1 = 8;
b.bParam2.aParam2 = "test";
System.out.println("---------打印b ---------");
System.out.println(b.bParam1);
System.out.println(b.bParam2.aParam1);
System.out.println(b.bParam2.aParam2);
System.out.println("---------打印b1 ---------");
System.out.println(b1.bParam1);
System.out.println(b1.bParam2.aParam1);
System.out.println(b1.bParam2.aParam2);
}
}
class A implements Serializable {
public int aParam1;
public String aParam2;
public A(int aParam1,String aParam2){
this.aParam1=aParam1;
this.aParam2=aParam2;
}
}
class B implements Serializable{
public int bParam1;
public A bParam2;
public Object cloneObj () throws Exception {
// 序列化
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
// 反序列化
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
}
结果