一、重寫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方式
如何抉擇?
實際開發中,根據兩種方式的優缺點進行選擇即可!