對象是互相引用的,即對象中可能包含了另外一個對象的引用html
淺克隆:一般只是對克隆的實例進行復制,但裏面的其餘子對象,都是共用;java
深克隆:克隆的時候會複製它的子對象的引用,裏面全部的變量和子對象都是又額外拷貝了一份。this
## 若是實現深克隆code
一個方法天然是重寫clone方法,添加如order.items=(LineItems)items.clone()的語句,也就是人爲地添加對引用對象的複製。 這個方法的缺點是若是引用對象有不少,或者說引用套引用不少重,那麼太麻煩了。 業界經常使用的方法是使用串行化而後反串行化的方法來實現深克隆。因爲串行化後,對象寫到流中,全部引用的對象都包含進來了,因此反串行化後,對等於生成了一個徹底克隆的對象。 這個方法的要求是對象(包括被引用對象)必須事先了Serializable接口,不然就要用transient關鍵字將其排除在複製過程當中。htm
public Object deepClone() throws IOException,ClassNotFoundException { //將對象寫到流裏 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); //從流裏讀回來 ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return ois.readObject(); }