您的位置:首页 > 其它

深克隆

2016-05-19 10:17 162 查看
浅拷贝(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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: