zoukankan      html  css  js  c++  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
    View Code

     

  • 相关阅读:
    hdu acm 2844 Coins 解题报告
    hdu 1963 Investment 解题报告
    codeforces 454B. Little Pony and Sort by Shift 解题报告
    广大暑假训练1 E题 Paid Roads(poj 3411) 解题报告
    hdu acm 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
    hdu acm 1114 Piggy-Bank 解题报告
    poj 2531 Network Saboteur 解题报告
    数据库范式
    ngnix 配置CI框架 与 CI的简单使用
    Vundle的安装
  • 原文地址:https://www.cnblogs.com/Jtianlin/p/4605477.html
Copyright © 2011-2022 走看看