浅复制和深复制的区别
浅复制:仅复制它自己这个对象,不复制它所引用的对象。
深复制:复制要复制的对象和它所引用的对象。
实现浅复制和深复制,主要是使用cloneable接口的clone方法,还是比较简单的,不多说了,直接上代码。
浅复制(shallow clone)
public class Husband implements Cloneable {
private int idNumber;
private String name;
public Husband(int idNumber, String name) {
super();
this.idNumber = idNumber;
this.name = name;
}
public int getIdNumber() {
return idNumber;
}
public void setIdNumber(int idNumber) {
this.idNumber = idNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//这里一定要public修饰,不要沿用Cloneable接口的protected
public Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}
public class ShallowCloneClient {
public static void main(String[] args) throws CloneNotSupportedException {
Husband husband = new Husband();
husband.setIdNumber(100);
husband.setName("张三");
//拷贝后husband和husband2是两个对象,两个对象,两个对象……
Husband husband2 = (Husband)husband.clone();
System.out.println(husband2.getIdNumber() + " " + husband2.getName());
}
}
深复制(deep clone)
public class Husband implements Cloneable {
private int idNumber;
private String name;
private Wife wife;
public int getIdNumber() {
return idNumber;
}
public void setIdNumber(int idNumber) {
this.idNumber = idNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Wife getWife() {
return wife;
}
public void setWife(Wife wife) {
this.wife = wife;
}
//这里一定要public修饰,不要沿用Cloneable接口的protected
public Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
Husband husband2 = (Husband) super.clone();
husband2.setWife((Wife)husband2.getWife().clone());
return husband2;
}
}
public class Wife implements Cloneable {
private int idNumber;
private String name;
public int getIdNumber() {
return idNumber;
}
public void setIdNumber(int idNumber) {
this.idNumber = idNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//这里一定要public修饰,不要沿用Cloneable接口的protected
public Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}
public class DeepCloneClient {
public static void main(String[] args) throws CloneNotSupportedException {
Husband husband = new Husband();
husband.setIdNumber(200);
husband.setName("李四");
Wife wife = new Wife();
wife.setIdNumber(300);
wife.setName("小花");
husband.setWife(wife);
Husband husband2 = (Husband) husband.clone();
System.out.println(husband2.getIdNumber() + " " + husband2.getName());
}
}
DeepCloneClinet运行结果:
200 李四