深克隆

来源:互联网 发布:2017教育行业数据报告 编辑:程序博客网 时间:2024/05/01 19:22

浅拷贝(Object类中的clone()方法)是指在拷贝对象时,对于基本数据类型的变量会重新复制一份,而对于引用类型的变量只是对引用进行拷贝。

深拷贝(或叫深克隆) 则是对对象及该对象关联的对象内容,都会进行一份拷贝。

 

 

实体类:

复制代码
package com.lin.test;import java.io.Serializable;/** * @athor tianlin * * 2015年6月28日 下午1:56:18 * **/public class Dog implements Serializable{    private static final long serialVersionUID = 1L;        private String dogName;    public String getDogName() {        return dogName;    }    public void setDogName(String dogName) {        this.dogName = dogName;    }}package com.lin.test;import java.io.Serializable;/** * @athor tianlin * * 2015年6月28日 下午1:43:24 * **/public class User implements Serializable{        private static final long serialVersionUID = 1L;    private String username;        private Dog dog;    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public Dog getDog() {        return dog;    }    public void setDog(Dog dog) {        this.dog = dog;    }    }
复制代码

 

克隆执行类:

复制代码
package com.lin.test;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;/** * @athor tianlin * * 2015年6月28日 下午1:44:08 * **/public class ObjCloner {        @SuppressWarnings("unchecked")    public static  <T>T cloneObj(T obj){                T retVal = null;                 try{                        // 将对象写入流中            ByteArrayOutputStream baos = new ByteArrayOutputStream();            ObjectOutputStream oos = new ObjectOutputStream(baos);            oos.writeObject(obj);                                    // 从流中读出对象            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());            ObjectInputStream  ois = new ObjectInputStream(bais);                        retVal = (T)ois.readObject();                    }catch(Exception e){            e.printStackTrace();        }                return retVal;    }}
复制代码

 

测试类:

复制代码
package com.lin.test;/** * @athor tianlin * * 2015年6月28日 下午1:42:47 * **/public class CloneTest {        public static void main(String[] args) {                User user = new User();        user.setUsername("张三");                Dog dog = new Dog();        dog.setDogName("小狗1");                user.setDog(dog);                User user2 = ObjCloner.cloneObj(user);                System.out.println("user username : "+user.getUsername());        System.out.println("user dogname : " + user.getDog().getDogName());        System.out.println("user2 username : "+user2.getUsername());        System.out.println("user2 dogname : " + user2.getDog().getDogName());                System.out.println(" -------------------------------------");                user2.setUsername("李四");        user2.getDog().setDogName("小狗2");;                System.out.println("user username : "+user.getUsername());        System.out.println("user dogname : " + user.getDog().getDogName());        System.out.println("user2 username : "+user2.getUsername());        System.out.println("user2 dogname : " + user2.getDog().getDogName());    }}
复制代码

 

运行结果:

复制代码
user username : 张三user dogname : 小狗1user2 username : 张三user2 dogname : 小狗1 -------------------------------------user username : 张三user dogname : 小狗1user2 username : 李四user2 dogname : 小狗2
复制代码
1 0