论clone深层复制和浅层复制

来源:互联网 发布:php 业务逻辑层 编辑:程序博客网 时间:2024/05/15 23:54

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

0 0
原创粉丝点击