深克隆与浅克隆

比如说,有一个Student类,再这个类里面有一个引用指向Teacher类,我创建一个Student类的对象s1,为s1全部都Set进值去,假如说s1的老师是王老师,然后我去克隆一个s1的对象,clones1,这个clones1里面的值和s1里面完全一样,clones1的老师也是王老师,此时我讲Teacher重新Set值,改为t2李老师,这时候,clones1的老师是李老师,s1的老师也是李老师,就是说克隆完成一个对象后,如果我将原对象里面引用的另外一个类的值也改变,那么原对象里面引用的值也会改变。这就是浅克隆。顾名思义,深克隆的话就是当我改变那个引用之后,原对象里面的引用不会改变,只是将克隆之后的引用改变。

浅克隆:

Teacher t1=new Teacher();

t1.setId(1);

t1.setName("王");

Student s1=new Student();

s1.setId(1);

s1.setName("张三");

s1.setTeacher(t1);

System.out.println("s1没有被克隆的老师是"+s1.getTeacher().getName());

Student clones1=(Student) s1.clone();

System.out.println("cloens的名字是:"+clones1.getName());

Teacher cloneT=clones1.getTeacher();

System.out.println("cloneT的名字是"+cloneT.getName());

cloneT.setName("李老师");

System.out.println("clones的老师是"+clones1.getTeacher().getName());

Teacher oldT=s1.getTeacher();

System.out.println("s的老师现在是:"+oldT.getName());

}

 

注:在将s1克隆前必须需将Student实现Cloneable接口并重写clone方法。

 

深克隆:

public class TestDeepClone {

public static Object deepClone(Object o) throws Exception{

FileOutputStream fos=new FileOutputStream("c:\\1.dat");

ObjectOutputStream oos=new ObjectOutputStream(fos);

oos.writeObject(o);

oos.flush();

oos.close();

FileInputStream fis=new FileInputStream("c:\\1.dat");

ObjectInputStream ois=new ObjectInputStream(fis);

Object cloneobj=ois.readObject();

ois.close();

return cloneobj;

}

public static void main(String[] args) throws Exception {

Teacher t1=new Teacher();

t1.setId(1);

t1.setName("王");

Student s=new Student();

s.setId(1);

s.setName("张三");

s.setTeacher(t1);

System.out.println("s的名字是"+s.getName());

System.out.println("s的老师是"+s.getTeacher().getName());

Student clones=(Student) deepClone(s);

System.out.println("clones的名字是"+clones.getName());

System.out.println("clones的老师的名字是"+clones.getTeacher().getName());

/**

 * 克隆出来的学生把老师给换了,然后我打印原来的学生的老师,和克隆出来的学生的老师比较

 */

Teacher changeTeacher=clones.getTeacher();

changeTeacher.setName("金老师");

changeTeacher.setId(2);

System.out.println("没有被克隆学生的老师的id"+s.getTeacher().getId());

System.out.println("没有被克隆学生的老师的name"+s.getTeacher().getName());

System.out.println("最终克隆的学生的老师的id"+clones.getTeacher().getId());

System.out.println("最终克隆的学生的老师的name"+clones.getTeacher().getName());

}

}

注:一定要将StudentTeacher类实现Serializable

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值