论clone深层复制和浅层复制

开心一笑

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

提出问题

浅层复制与深层复制区别是什么???

我的特长

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

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

/**
 * 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,681评论 30 472
  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 2,091评论 1 16
  • 201701《把时间当作朋友》的读书笔记 作 者:李笑来 关于作者: 李笑来,《通往财富自由之路》专栏作者,号称比...
    格式化_001阅读 335评论 0 1
  • 导演: 亚历克斯·普罗亚斯 编剧: 亚历克斯·普罗亚斯 / 莱姆·多布斯 / 大卫·S·高耶 主演: 卢夫斯·塞维...
    抽屉电影阅读 426评论 0 0
  • R:通过了解“安慰剂效应”,我们就能够知道神婆们对病痛的治疗为什么看上去似乎有效了。 I:在现实中,我们对于那些有...
    文艺小草阅读 384评论 0 1

友情链接更多精彩内容