首页 > 编程语言 > 详细

java中的拷贝(二)深克隆

时间:2016-07-10 23:15:34      阅读:214      评论:0      收藏:0      [点我收藏+]

浅拷贝(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

java中的拷贝(二)深克隆

原文:http://www.cnblogs.com/doudouxiaoye/p/5658813.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!