1.定义
用原型实例制定创建对象的种类,并通过拷贝这些原型创建新的对象,用于创建重复的对象,同时又能保证性能。实现克隆操作,在 JAVA 继承 Cloneable,重写 clone()。
不用重新初始化对象,而是动态地获得对象运行时的状态。
浅拷贝和深拷贝
如果字段是值类型的,则对该字段执行逐位复制;
如果字段是引用类型的,则复制引用但是不复制引用的对象,原始对象及其复本引用同一对象。
浅拷贝:被拷贝对象的所有变量都含有与原对象相同的值,而且对其他对象的引用仍然是指向原来的对象。即浅拷贝只负责当前对象实例,对引用的对象不做拷贝。
深拷贝:把引用对象的变量执行复制过的新对象,而不是原有的被引用的对象。
2.实现
2.1浅拷贝
public class WordExperience {
String workDate;
String company;
}
public class Resume implements Cloneable {
private String name;//值类型
private String sex;//值类型
private String age;//值类型
private WordExperience work;//引用类型
public Resume(String name) {
this.name=name;
work=new WordExperience();
}
@Override
public Resume clone() throws CloneNotSupportedException {
return (Resume) super.clone();
}
public void Display() {
System.out.print("name:"+name+",sex:"+sex+",age:"+age);
System.out.println(",work.workDate:"+work.workDate+",work.company:"+work.company);
}
public void SetPersonalInfo(String sex, String age) {
this.sex=sex;
this.age=age;
}
public void SetWordExperience(String timeArea, String company) {
work.workDate=timeArea;
work.company=company;
}
}
public static void main(String[] args) throws CloneNotSupportedException {
Resume a=new Resume("ting");
a.SetPersonalInfo("man", "29");
a.SetWordExperience("1998-2000", "A");
Resume b=(Resume)a.clone();
b.SetPersonalInfo("woman", "30");
b.SetWordExperience("2000-2016", "B");
a.Display();
b.Display();
}
输出:
name:ting,sex:man, age:29,work.workDate:2000-2016,work.company:B
name:ting,sex:woman,age:30,work.workDate:2000-2016,work.company:B
工作经验都是显示最后一次设置的值,而sex与age能分别显示。
2.2深拷贝
public class WordExperience implements Cloneable{
public String workDate;
public String company;
@Override//"工作经验实现克隆方法"
public WordExperience clone() throws CloneNotSupportedException {
return (WordExperience)super.clone();
}
}
public class Resume implements Cloneable {
private String name;
private String sex;
private String age;
private WordExperience work;
public Resume(String name) {
this.name=name;
work=new WordExperience();
}
public Resume(WordExperience wrok) throws CloneNotSupportedException {
this.work=wrok.clone();
}
@Override
public Resume clone() throws CloneNotSupportedException {
Resume resume=new Resume(this.work);
resume.name=name;
resume.sex=sex;
resume.age=age;
return resume;
}
public void Display() {
System.out.print("name:"+name+",sex:"+sex+",age:"+age);
System.out.println(",work.workDate:"+work.workDate+",work.company:"+work.company);
}
public void SetPersonalInfo(String sex, String age) {
this.sex=sex;
this.age=age;
}
public void SetWordExperience(String workDate, String company) {
work.workDate=workDate;
work.company=company;
}
}
public static void main(String[] args) throws CloneNotSupportedException {
Resume a=new Resume("daniao");
a.SetPersonalInfo("man", "29");
a.SetWordExperience("1998-2000", "ting");
Resume b=(Resume)a.clone();
b.SetWordExperience("2000-2016", "ben");
a.Display();
b.Display();
}
}
输出:
name:daniao,sex:man,age:29,work.workDate:1998-2000,work.company:ting
name:daniao,sex:man,age:29,work.workDate:2000-2016,work.company:ben