您的位置:首页 > 编程语言 > Java开发

Java克隆对象

2014-05-12 16:20 351 查看
一。 使用Cloneable接口

实现Cloneable接口的类都具备被拷贝的能力,拷贝在内存中进行,比new生成对象性能明显提升;
clone方法是Object类的protected方法,也就是在用户编写的代码中不能直接调用。为此必须重写定义clone方法,并声明为public,
Cloneable接口的出现与接口正常使用没有关系,是一个空接口,它只是一个标记表示一个对象需要克隆,如果一个对象需要克隆,而没有实现Cloneable接口,就会产生一个(checked
exception)
Clone()方法存在与Object对象中,但是其不会将对象的全部属性都拷贝,而是有选择的拷贝
基本类型:
对象:如果变量是一个实例对象,只拷贝地址引用;
String字符串:拷贝地址引用,但是修改时,会从字符串池中重新生成新的字符串,原来的保持不变;

对于Clone实现对象的拷贝:需要新建大量的对象,工程量大可以使用序列化来实现对象的拷贝
 
//Person.java
public class Person implements Cloneable {
private String name;

public String getName() {
return name;
}

public void setName(String aName) {
name = aName;
}

public Person clone() {
Person person = null;
try {
person = (Person) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return person;
}

public Person() {

}
}


public class CloneTest {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Person a = new Person();
a.setName("yang");

Person b = a.clone();
b.setName("Qiang");

System.out.println("A name :" + a.getName());

}

}


二、使用序列化来实现对象的拷贝
在内存中通过字节流的拷贝是比较容易的,把木对象写入到一个字节流中,再从字节流中毒出来,这样可以创建一个新的对象,且新对象与木对象不存在引用共享的问题,实现的对象的深拷贝

 public class CloneUtils {
@SuppressWarnings("unchecked")
public static <T extends Serializable> T clone(T obj){
T cloneObj = null;
try {
//写入字节流
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream obs = new ObjectOutputStream(out);
obs.writeObject(obj);
obs.close();

//分配内存,写入原始对象,生成新对象
ByteArrayInputStream ios = new ByteArrayInputStream(out.toByteArray());
ObjectInputStream ois = new ObjectInputStream(ios);
//返回生成的新对象
cloneObj = (T) ois.readObject();
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
return cloneObj;
}
}
使用该工具类的对象必须实现Searializable接口,否则无法克隆,
例子:

publicclass Email implements Serializable{

}

publicclass Client{
publicstatic void main(){
Emailemail = new Email();
Emailcopy = CloneUtils.clone(email);
}
}


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