在看《大話設計模式》
看到深拷貝和淺拷貝有點不太懂。
如果有引用,
- 淺拷貝:原對象和副本引用同一對象。對屬性直接拷貝。是引用類型的話,只複製引用,不復制引用的對象。
- 深拷貝:原對象和副本引用的不是同一個對象。
淺拷貝:
class WorkExperience{
String workDate;
String company;
public WorkExperience() {
}
public void SetworkDate(String a) {
this.workDate=a;
}
public String getWorkDate() {
return workDate;
}
public void SetCompany(String a) {
this.company=a;
}
public String getCompany() {
return company;
}
}
class Resume implements Cloneable{
private String name;
private String sex;
private String age;
private WorkExperience work;
public Resume(String name) {
this.name=name;
work=new WorkExperience();
}
public void SetPerInfo(String sex,String age) {
this.sex=sex;
this.age=age;
}
public void SetWorkExperience(String date,String comp) {
work.company=comp;
work.workDate=date;
}
public void Show() {
System.out.println(name+","+sex+','+age);
System.out.println(work.workDate+','+work.company);
}
protected Object clone() {
Object obj=null;
try {
obj= super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return (Resume)obj;
}
}
public class PrototypeDemo {
public static void main(String args[]) {
Resume st=new Resume("老蔡");
st.SetPerInfo("man", "10");
st.SetWorkExperience("1990-1995", "BAt");
st.Show();
Resume st1=(Resume)st.clone();
st1.SetPerInfo("man","30");
st1.SetWorkExperience("1999-2000", "IBM");
st1.Show();
st.Show();
}
}
看這裏,st1
是st
的副本,st
裏面有個WorkExperience引用,所以st1
引用了同一個對象。
就結果而言,st1
裏這個對象改變了,st
也要改變。
st1.Show();
st.Show();
輸出不同。
深拷貝:
class WorkExperience implements Cloneable{
String workDate;
String company;
public void SetworkDate(String a) {
this.workDate=a;
}
public String getWorkDate() {
return workDate;
}
public void SetCompany(String a) {
this.company=a;
}
public String getCompany() {
return company;
}
public Object Clone() {
Object obj=null;
try {
obj=super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return (Object)obj;
}
}
class Resume implements Cloneable{
private String name;
private String sex;
private String age;
private WorkExperience work;
public Resume(String name) {
this.name=name;
work=new WorkExperience();
}
public Resume(WorkExperience a) {
this.work=a;
}
public void SetPerInfo(String sex,String age) {
this.sex=sex;
this.age=age;
}
public void SetWorkExperience(String date,String comp) {
work.company=comp;
work.workDate=date;
}
public void Show() {
System.out.println(name+","+sex+','+age);
System.out.println(work.workDate+','+work.company);
}
protected Object clone() {
Resume obj = null;
try {
obj = (Resume) super.clone();
obj.work=(WorkExperience) obj.work.Clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return obj;
}
}
public class PrototypeDeepDemo {
public static void main(String args[]) {
Resume st=new Resume("老蔡");
st.SetPerInfo("man", "10");
st.SetWorkExperience("1990-1995", "BAt");
st.Show();
Resume st1=(Resume)st.clone();
st1.SetPerInfo("man","30");
st1.SetWorkExperience("1999-2000", "IBM");
st1.Show();
st.Show();
}
}