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

     

  • 相关阅读:
    GNU make manual 翻译(九十九)
    GNU make manual 翻译( 九十五)
    Shell的 for 循环小例子
    makefile中对目录遍历的小例子
    GNU make manual 翻译(九十三)
    GNU make manual 翻译( 一百)
    GNU make manual 翻译( 九十七)
    GNU make manual 翻译( 九十八)
    mapserver4.8.3 的readme.win32的中文翻译文件
    遥控器编程
  • 原文地址:https://www.cnblogs.com/Jtianlin/p/4605477.html
Copyright © 2011-2022 走看看