一、重写clone方法
克隆一个对象,该对象要实现克隆接口,即 implements Cloneable,重写克隆方法
如下代码:
public class Teacher implements Cloneable {
public int getTno() {
return tno;
}
public void setTno(int tno) {
this.tno = tno;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private int tno;
private String name;
@Override
protected Object clone() {
Teacher teacher = null;
try {
teacher = (Teacher)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return teacher;
}
}
当里面有更深层的引用的时候,被引用的类也实现克隆方法, 如下:学生引用老师,如果想实现深拷贝,要重写学生类的克隆方法。
import org.junit.Test;
public class Student implements Cloneable{
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private int sno ;
private String name;
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
// 引用老师
private Teacher teacher;
@Override
public Object clone() throws CloneNotSupportedException {
Student s = null;
try{
s = (Student)super.clone();
// 引用也克隆和设置下
Teacher t = (Teacher)this.teacher.clone();
s.setTeacher(t);
}catch (Exception e){
e.printStackTrace();
}
return s;
}
}
二、序列化实现克隆
//工具方法
public Object cloneObject(Object object) throws IOException, ClassNotFoundException {
//将对象序列化
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(object);
//将字节反序列化
ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
Object obj = objectInputStream.readObject();
return obj;
}
重写clone方法 与 通过序列化 两种拷贝方式比较:
clone方法:
优点:速度快,效率高
缺点:在对象引用比较深时,使用此方式比较繁琐
通过序列化:
优点:非常简便的就可以完成深度copy
缺点:由于序列化的过程需要跟磁盘打交道,因此效率会低于clone方式
如何抉择?
实际开发中,根据两种方式的优缺点进行选择即可!