前往顾页
以后地位: 主页 > 收集编程 > Jsp实例教程 >

Java中的深度拷贝和浅度拷贝

时候:2012-05-07 22:09来源:知行网www.zhixing123.cn 编辑:麦田守望者

浅度拷贝:只复制一个工具,工具外部存在的指向其他工具数组或援引则不复制。 

深度拷贝:工具,工具外部的援引均复制。

详细我们经由过程例子阐发一下:

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;}

其运行成果为:

student Name is:hope;Sage is:22

professor Name:11111;age:111

student Name is:hope;Sage is:22

professor Name:wei;age:43

------分开线----------------------------
标签(Tag):Java JAVA实例教程 JAVA根本教程 Java源代码 Java技能
------分开线----------------------------
保举内容
猜你感兴趣