返回首页
当前位置: 主页 > 网络编程 > 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技巧
------分隔线----------------------------
推荐内容
猜你感兴趣