拷貝,顧名思義就是復制母蛛,分配新的內存翩剪,產生新的對象,與new關鍵字類似彩郊。然而前弯,拷貝中存在部分隱匿的差別,需要我們細細查看
// 學士:姓名 年齡 信息
public class Bachelor {
private String name;
private int age;
private Info info;
public Bachelor(String name,int age,Info info){
this.name = name;
this.age = age;
this.info = info;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Info getInfo() {
return info;
}
public void setInfo(Info info) {
this.info = info;
}
}
// 信息:技能 項目
class Info{
private String level;
private Project project;
public Info(String level,Project project){
this.level = level;
this.project = project;
}
public Project getProject() {
return project;
}
public void setProject(Project project) {
this.project = project;
}
}
// 項目:項目名稱
class Project{
private String projectName;
public Project(String projectName){
this.projectName = projectName;
}
}
- 引用拷貝
不同引用指向相同地址秫逝,并不分配新的內存空間恕出;
// 測試代碼
Project project = new Project("myApp");
Info info = new Info("A",project);
Bachelor bachelorOne = new Bachelor("Cheng",23,info);
Bachelor bachelorTwo = bachelorOne;
System.out.println(bachelorOne);
System.out.println(bachelorTwo);
// 打印出相同的地址
javaBasic.Bachelor@15db9742
javaBasic.Bachelor@15db9742
- 對象拷貝
// 實現(xiàn)Cloneable接口,復寫clone()方法
public class Bachelor implements Cloneable{
@Override
protected Object clone() throws CloneNotSupportedException {
Bachelor newBachelor = (Bachelor) super.clone();
return newBachelor;
}
}
// 測試代碼
Project project = new Project("myApp");
Info info = new Info("A",project);
Bachelor bachelorOne = new Bachelor("Cheng",23,info);
Bachelor bachelorTwo = (Bachelor) bachelorOne.clone();
System.out.println(bachelorOne);
System.out.println(bachelorTwo);
System.out.println(bachelorOne.getName() == bachelorTwo.getName());
// 打印出不同地址违帆,且name引用相同
javaBasic.Bachelor@15db9742
javaBasic.Bachelor@6d06d69c
true
- 淺拷貝
如上面測試代碼浙巫,分配新的內存,創(chuàng)建新對象刷后,但是name屬性卻存在相同的引用狈醉,即拷貝主對象,卻不拷貝主對象里面的對象惠险;
如何實現(xiàn)name屬性的拷貝呢苗傅?
// 重新生成name對象
@Override
protected Object clone() throws CloneNotSupportedException {
Bachelor newBachelor = (Bachelor) super.clone();
newBachelor.name = new String(this.name);
return newBachelor;
}
按照此種邏輯,info對象也是淺拷貝班巩,如何實現(xiàn)主對象中對象的拷貝呢渣慕?
// 類實現(xiàn)Cloneable接口嘶炭,復寫clone方法
// 在clone()方法中,實現(xiàn)主對象內對象的重新生成
public class Bachelor implements Cloneable{
@Override
protected Object clone() throws CloneNotSupportedException {
Bachelor newBachelor = (Bachelor) super.clone();
newBachelor.name = new String(this.name);
newBachelor.info = (Info) this.info.clone();
return newBachelor;
}
}
class Info implements Cloneable{
@Override
protected Object clone() throws CloneNotSupportedException {
Info newInfo = (Info) super.clone();
// 將level屬性和project方法均重新生成
newInfo.level = new String(this.level);
newInfo.project = (Project) this.project.clone();
return newInfo;
}
class Project implements Cloneable{
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return (Project) super.clone();
}
}
// 測試代碼
Project project = new Project("myApp");
Info info = new Info("A",project);
Bachelor bachelorOne = new Bachelor("Cheng",23,info);
Bachelor bachelorTwo = (Bachelor) bachelorOne.clone();
System.out.println(bachelorOne);
System.out.println(bachelorTwo);
System.out.println(bachelorOne.getName() == bachelorTwo.getName());
System.out.println(bachelorTwo.getInfo() == bachelorOne.getInfo());
System.out.println(bachelorTwo.getInfo().getProject() == bachelorOne.getInfo().getProject());
// 實現(xiàn)主對象內部所有對象的拷貝
javaBasic.Bachelor@15db9742
javaBasic.Bachelor@6d06d69c
false
false
false
- 深拷貝
實現(xiàn)主對象全部結構的拷貝逊桦,包括主對象中的對象眨猎;