论clone深层复制和浅层复制

开心一笑

什么是制度?
二嫂为了改二哥晚回家的习惯,跟二哥订了个制度,晚上11点不回家就锁门!第一周很奏效,第二周二哥毛病又犯了,二嫂果断执行制度,把门锁了。结果二哥干脆不回家了。
二嫂很郁闷,难道制度订错了吗? 后来经过党的群众路线教育实践活动督导组指点,修改制度:晚11点不回家,我就开着家门睡觉!谁想来就来。二哥大惊,从此11点之前准时回家。

视频教程

大家好,我录制的视频《Java之优雅编程之道》已经在CSDN学院发布了,有兴趣的同学可以购买观看,相信大家一定会收获到很多知识的。谢谢大家的支持……

视频地址:http://edu.csdn.net/lecturer/994

自我介绍

浅层复制与深层复制概念:

  浅层复制: 浅层复制仅仅复制所考虑的对象,而不复制它所引用的对象。
  深层复制:深层复制要复制的对象引用的对象都复制一遍。
  

我的特长

/**
 * Created by Ay on 2016/2/25.
 */
public class Person implements Cloneable{

    private int id;

    private String name;

    public Person(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    @Override
    protected Object clone(){
        Object o = null;
        try {
           o = super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return o;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public static void main(String[] args) {
        Person person = new Person(1,"小毅");
        Person person2 = (Person)person.clone();
        person2.setId(2);
        person2.setName("小兰");
        System.out.println(person.getId() + " " + person.getName());//1 小毅
        System.out.println(person2.getId() + " " + person2.getName());//2小兰
    }
}

上面只是一个简单的clone浅复制,并且不带引用……
下面是图片:
这里写图片描述“`

下面看一个带有引用的浅复制

/**
 * Created by Ay on 2016/3/16.
 */
public class ShallowClone implements Cloneable{

    private int id;
    private String name;
    //存在引用person类
    private Person person;

    public ShallowClone(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    public static void main(String[] args) throws Exception{
        ShallowClone shallowClone = new ShallowClone(1,"Ay");
        shallowClone.setPerson(new Person(1,"Al"));
        //复制
        ShallowClone clone = (ShallowClone)shallowClone.clone();
        //打印信息
        System.out.println(clone.getId() + " " + clone.getName());//result:1 Ay
        System.out.println(clone.getPerson().getId() + " " + clone.getPerson().getName());//result:1 Al
        //对旧的deepClone中的person重新设置值
        shallowClone.getPerson().setName("new Al");//1 new Al
        //打印新的clone中person的值
        System.out.println(clone.getPerson().getId() + " " + clone.getPerson().getName());
    }
}

浅复制的引用没办法被复制,用的是同一个引用
这里写图片描述

利用串行化来做深复制
import java.io.*;

/**
 * Created by Ay on 2016/3/16.
 */
public class ShallowClone implements Cloneable,Serializable{

    private int id;
    private String name;
    //存在引用person类
    private Person person;

    public ShallowClone(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public Object deepClone()throws Exception{
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(this);
        //从流里读出来
        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream oi=new ObjectInputStream(bais);
        return(oi.readObject());
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    public static void main(String[] args) throws Exception{
        //创建ShallowClone对象,设置值
        ShallowClone shallowClone = new ShallowClone(1,"Ay");
        Person person = new Person(1,"A1");
        shallowClone.setPerson(person);

        //对ShallowClone对象进行深复制,得到deepClone
        ShallowClone deepClone = (ShallowClone)shallowClone.deepClone();
        System.out.println(deepClone.getId() + " " + deepClone.getName());//result:1 Ay
        System.out.println(deepClone.getPerson().getId() + " " + deepClone.getPerson().getName());//result:1 A1

        shallowClone.getPerson().setId(2);
        shallowClone.getPerson().setName("Al2");
        //无论对ShallowClone中的person如何修改值,都不影响deepClone,因为深复制呗
        System.out.println(deepClone.getId() + " " + deepClone.getName());//result:1 Ay
        System.out.println(deepClone.getPerson().getId() + " " + deepClone.getPerson().getName());//result:1 A1
    }
}
  • 要进行深复制,ShallowClone和Person都要实现Cloneable,Serializable,否则会报错。

参考文章

http://www.cnblogs.com/yxnchinahlj/archive/2010/09/20/1831615.html

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿_毅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值