zoukankan      html  css  js  c++  java
  • java中的拷贝(二)深克隆

    浅拷贝(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 : 小狗1
    user2 username : 张三
    user2 dogname : 小狗1
    -------------------------------------
    user username : 张三
    user dogname : 小狗1
    user2 username : 李四
    user2 dogname : 小狗2

    摘自:http://www.cnblogs.com/Jtianlin/p/4605477.html
  • 相关阅读:
    优启通(UEFI版)重装系统
    Beta阶段项目总结
    第二个阶段团队绩效管理
    第二阶段冲刺10天 第十天
    第二阶段冲刺10天 第九天
    第二阶段冲刺10天 第八天
    第二阶段冲刺10天 第七天
    第二阶段冲刺10天 第六天
    第二阶段冲刺10天 第五天
    第二阶段冲刺10天 第四天
  • 原文地址:https://www.cnblogs.com/doudouxiaoye/p/5658813.html
Copyright © 2011-2022 走看看