首页 > 代码库 > 这个代码能很好的明说深度拷贝
这个代码能很好的明说深度拷贝
浅度拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制。
深度拷贝:对象,对象内部的引用均复制。
具体我们通过例子分析一下:
class Professor implements Cloneable
//所有要进行克隆的对象所属的类必须实现java.lang.Cloneable接口
{ private String pname;private int page;
public String getPname()
{return pname;}
public void setPname(String pname)
{this.pname = pname;}
public int getPage()
{return page;}
public void setPage(int page)
{this.page = page;}
Professor(String pname,int page)
{this.pname=pname;
this.page=page;
}
public Object clone()
{Professor p=null;
try
{p=(Professor)super.clone();
}
catch(Exception e)
{e.printStackTrace();
}return p;}
public void display()
{System.out.println("professor Name:"+pname+";age:"+page);
}}
class Student implements Cloneable{
String sname; int sage; String srollno; Professor prof;
public Student(String sname,int sage,Professor p)
{this.sname=sname; this.sage=sage; prof=p;
}
public Object clone()
{Student stud=null;
try{stud=(Student)super.clone();//注意这里,我们做的只是浅复制,我们并没有对Student下的Professor做进一步复制。
其下的prof是一个引用,//这里我们仅仅拷贝了引用的地址,并没有对其中的属性进行拷贝。
}
catch(……)
{e.printStackTrace();
}return stud;}
public void display()
{System.out.println("student Name is:"+sname+";Sage is:"+sage);
prof.display();}}
public class Test {
public static void main(String str[])
{Student s=new Student("hope",22,new Professor("wei",43));
Student s2=(Student)s.clone();
s.prof.setPage(111);
//这我们对prof引用进行了修改,由于该程序是浅复制
//,所以,我们修改s的同时,s2的改引用也发生了变化。
s.prof.setPname("11111"); s.display(); s2.display();
}}
其运行结果为:
student Name is:hope;Sage is:22
professor Name:11111;age:111
student Name is:hope;Sage is:22
professor Name:11111;age:111
为了做到深层复制,我们修改代码如下:
public Object clone()
{Student stud=null;
try{stud=(Student)super.clone();
stud.prof=(Professor)prof.clone();//对其下层的引用也克隆一下。
}catch(……)
}return stud;}
这个代码能很好的明说深度拷贝