在我们学习过程中,会发现java很多非常重要的接口,比如Cloneable,Serializable,Comparable等等之类的,今天我就总结一下Cloneable接口。
我学习到现在觉得最好的学习资源就是源码以及源码的注释,任何其他的都是对源码的翻译和解读,现在我就说说我对源码及注释的理解,如何大家想从源头上获取,建议大家看Cloneable接口和Object中的clone()方法。
正文:
1.如果一个对象要实现拷贝,就必须要实现Cloneable接口,只有实现了该接口,该类的对象采用拷贝的能力,否则调用clone()是会抛出CloneNotSupportedException异常
2.拷贝分为浅拷贝和深拷贝
浅拷贝是拷贝的默认方式(逐个field拷贝),只适用于基本数据类型和不可变类型(如String)
深拷贝是适用于有引用成员变量的情形,因为浅拷贝在拷贝应用成员变量时只是拷贝了引用,所以要自己特别处理,若不处理拷贝出来的对象都是公用一块内存(一变都变)
例子:
浅拷贝:
public class Resume_ShallowCopy implements Cloneable {
private String name;
private String sex;
private String age;
private String timeArea;
private String company;
public Resume_ShallowCopy(String name) {
this.name = name;
}
public void setPersonalInfo(String sex, String age) {
this.sex = sex;
this.age = age;
}
public void setWorkExperience(String timeArea, String company) {
this.timeArea = timeArea;
this.company = company;
}
public void display() {
System.out.println(name + ", " + sex + ", " + age);
System.out.println("工作经历:" + timeArea + ", " + company);
System.out.println(age.hashCode());
System.out.println();
}
}
深拷贝:
public class Resume_DeepCopy implements Cloneable {
private String name;
private String sex;
private String age;
private WorkExperience work; // 引用类型
public Resume_DeepCopy(String name) {
this.name = name;
work = new WorkExperience();
}
public Resume_DeepCopy(WorkExperience work) throws CloneNotSupportedException {
this.work = (WorkExperience) work.clone();
}
public void setPersonalInfo(String sex, String age) {
this.sex = sex;
this.age = age;
}
public void setWork(String workDate, String company) {
work.setWorkDate(workDate);
work.setCompany(company);
}
public void display() {
System.out.println(name + ", " + sex + ", " + age);
System.out.println("工作经历:" + work.getWorkData() + " " + work.getCompany());
}
@Override
protected Object clone() throws CloneNotSupportedException {
Resume_DeepCopy obj = new Resume_DeepCopy(work);//把work拷贝一下
obj.name = name;// 逐个拷贝
obj.sex = sex;
obj.age = age;
return obj;
}
}
引用类型:
public class WorkExperience implements Cloneable {
private String workDate;
private String company;
public String getWorkData() {
return workDate;
}
public void setWorkDate(String workData) {
this.workDate = workData;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
Main:
public class Console {
public static void main(String[] args) throws CloneNotSupportedException {
Resume_DeepCopy a = new Resume_DeepCopy("大鸟");
a.setPersonalInfo("男", "29");
a.setWork("1998-2000", "XX公司");
Resume_DeepCopy b = (Resume_DeepCopy) a.clone();
b.setWork("1998-2006", "YY企业");
Resume_DeepCopy c = (Resume_DeepCopy) a.clone();
c.setPersonalInfo("男", "24");
c.setWork("1998-2003", "ZZ企业");
a.display();
b.display();
c.display();
}
}
拷贝还设计到一个设计模式:原型模式~~~ 有兴趣自己看~~~