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();
}
}
结果
本文通过两个实例演示了在Java中如何实现对象的深复制和浅复制。首先利用Cloneable接口和Object类中的clone方法实现浅复制,并展示了当原始对象发生变化时,副本对象中引用类型成员变量也会随之改变的情况。接着介绍了通过序列化实现深复制的方法,这种方法能够确保副本对象完全独立于原始对象。


4294

被折叠的 条评论
为什么被折叠?



