在Java中芥炭,復(fù)制對象有兩類方法,一種是淺復(fù)制园蝠,一種是深復(fù)制
先來一段淺復(fù)制的代碼
public class Prototype implements Cloneable {
public Object clone() throws CloneNotSupportedException {
Prototype proto = (Prototype) super.clone();
return proto;
}
}
一個(gè)類,只需要實(shí)現(xiàn)Cloneable接口彪薛,覆寫clone方法茂装,此處clone方法可以改成任意的名稱陪汽,因?yàn)镃loneable接口是個(gè)
空接口,你可以任意定義實(shí)現(xiàn)類的方法名挚冤,如cloneA或者cloneB,因?yàn)榇颂幍闹攸c(diǎn)是super.clone()這句話训挡,super.clone()調(diào)用的是Object的clone()方法,而在Object類中澜薄,clone()是native的,這涉及到j(luò)ava中本地代碼的調(diào)用肤京,這里不予討論颊艳。我將結(jié)合對象的淺復(fù)制和深復(fù)制來說一下,首先需要了解對象深棋枕、淺復(fù)制的概念:
淺復(fù)制:將一個(gè)對象復(fù)制后,基本數(shù)據(jù)類型的變量都會重新創(chuàng)建重斑,而引用類型,指向的還是原對象所指向的窥浪。
深復(fù)制:將一個(gè)對象復(fù)制后,不論是基本數(shù)據(jù)類型還有引用類型漾脂,都是重新創(chuàng)建的假颇。簡單來說符相,就是深復(fù)制進(jìn)行了完全徹底的復(fù)制,而淺復(fù)制不徹底啊终。
現(xiàn)在傲须。寫一個(gè)深淺復(fù)制的例子:
public class Prototype implements Cloneable, Serializable {
private static final long serialVersionUID = 1L;
private String string;
private SerializableObject obj;
/* 淺復(fù)制 */
public Object clone() throws CloneNotSupportedException {
Prototype proto = (Prototype) super.clone();
return proto;
}
/* 深復(fù)制 */
public Object deepClone() throws IOException, ClassNotFoundException {
/* 寫入當(dāng)前對象的二進(jìn)制流 */
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
/* 讀出二進(jìn)制流產(chǎn)生的新對象 */
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
public SerializableObject getObj() {
return obj;
}
public void setObj(SerializableObject obj) {
this.obj = obj;
}
}
class SerializableObject implements Serializable {
private static final long serialVersionUID = 1L;
}
要實(shí)現(xiàn)深復(fù)制,其實(shí)很簡單例衍,只需要采用流的形式讀入當(dāng)前對象的二進(jìn)制輸入,再寫出二進(jìn)制數(shù)據(jù)對應(yīng)的對象就可以了已卸,不需要自己一個(gè)個(gè)的把對象里面的屬性再復(fù)制哦佛玄,哈哈累澡。