1 package com.xingoo.clone;2
3 import java.io.ByteArrayInputStream;4 import java.io.ByteArrayOutputStream;5 import java.io.IOException;6 import java.io.ObjectInputStream;7 import java.io.ObjectOutputStream;8 import java.io.Serializable;9 import java.util.Date;10
11 classWife implements Serializable{12 privateString name;13 privateDate birthday;14
15 publicWife(){16 name = "芙蓉姐姐";17 birthday = newDate();18 }19 publicDate getBirthday(){20 returnbirthday;21 }22
23 publicString getName() {24 returnname;25 }26 public voidsetName(String name) {27 this.name =name;28 }29 }30 classHusband implements Cloneable,Serializable{31 privateWife wife;32 privateDate birthday;33
34 publicHusband(){35 wife = newWife();36 birthday = newDate();37 }38
39 publicWife getWife(){40 returnwife;41 }42
43 publicDate getBirthday(){44 returnbirthday;45 }46 /**47 * 浅克隆一个对象48 */
49 publicObject clone() {50 Husband husband = null;51 try{52 husband =(Husband)super.clone();53 }catch(CloneNotSupportedException e){54 e.printStackTrace();55 }finally{56 returnhusband;57 }58 }59 /**60 * 利用串行化深克隆一个对象,把对象以及它的引用读到流里,在写入其他的对象61 * @return62 * @throws IOException63 * @throws ClassNotFoundException64 */
65 publicObject deepClone() throws IOException,ClassNotFoundException {66 //将对象写到流里
67 ByteArrayOutputStream bos = newByteArrayOutputStream();68 ObjectOutputStream oos = newObjectOutputStream(bos);69 oos.writeObject(this);70 //从流里读回来
71 ByteArrayInputStream bis = newByteArrayInputStream(bos.toByteArray());72 ObjectInputStream ois = newObjectInputStream(bis);73 returnois.readObject();74 }75 }76 public classTest {77 public static voidmain(String[] args){78 try{79 Husband husband = newHusband();80 System.out.println("husband birthday"+husband.getBirthday().getTime());81 System.out.println("wife birthday"+husband.getWife().getBirthday().getTime());82 System.out.println();83 Husband husband1 =(Husband)husband.clone();84 System.out.println("husband1 birthday"+husband1.getBirthday().getTime());85 System.out.println("wife birthday"+husband1.getWife().getBirthday().getTime());86 System.out.println();87 System.out.println("是否是同一个husband"+(husband ==husband1));88 System.out.println("是否是同一个wife"+ (husband.getWife() ==husband1.getWife()));89 System.out.println();90 Husband husband2 =(Husband)husband.deepClone();91 System.out.println("husband2 birthday"+husband2.getBirthday().getTime());92 System.out.println("wife birthday"+husband2.getWife().getBirthday().getTime());93 System.out.println();94 System.out.println("是否是同一个husband"+(husband ==husband2));95 System.out.println("是否是同一个wife"+ (husband.getWife() ==husband2.getWife()));96 }catch(Exception e){97 e.printStackTrace();98 }99 }100 }