浅谈Java中实现深拷贝的两种方式—clone() & Serialized
clone()方法麻烦一些,需要将所有涉及到的类实现声明式接口Cloneable,并覆盖Object类中的clone()方法,并设置作用域为public(这是为了其他类可以使用到该clone方法)。
序列化的方法简单,需要将所有涉及到的类实现接口Serializable
packageb1ch06.clone; importjava.io.Serializable; classCarimplementsCloneable,Serializable{ privateStringband; publicCar(Stringband){ this.band=band; } publicStringgetBand(){ returnband; } publicvoidsetBand(Stringband){ this.band=band; } @Override publicObjectclone()throwsCloneNotSupportedException{ returnsuper.clone(); } }
packageb1ch06.clone; importjava.io.Serializable; classEmployeeimplementsCloneable,Serializable{ privateStringname; privateCarcar; publicEmployee(Stringname,Carcar){ this.name=name; this.car=car; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicCargetcar(){ returncar; } publicvoidsetcar(Carcar){ this.car=car; } protectedvoidtest(){ System.out.println("testfunc"); } @Override publicObjectclone()throwsCloneNotSupportedException{ Employeeemployee_cloned=(Employee)super.clone(); Carcar_cloned=(Car)this.car.clone(); employee_cloned.setcar(car_cloned); returnemployee_cloned; } }
packageb1ch06.clone; importjava.io.*; publicclassSerializedClone{ @SuppressWarnings("unchecked") publicstaticTclone(Tobj){ TcloneObj=null; try{ //写入字节流 ByteArrayOutputStreamout=newByteArrayOutputStream(); ObjectOutputStreamobs=newObjectOutputStream(out); obs.writeObject(obj); obs.close(); //分配内存,写入原始对象,生成新对象 ByteArrayInputStreamios=newByteArrayInputStream(out.toByteArray()); ObjectInputStreamois=newObjectInputStream(ios); //返回生成的新对象 cloneObj=(T)ois.readObject(); ois.close(); }catch(Exceptione){ e.printStackTrace(); } returncloneObj; } }
packageb1ch06.clone; publicclassMyClone{ publicstaticvoidmain(String[]args){ Carcar=newCar("BMW"); Employeeemployee=newEmployee("ANDY",car); //方法一:覆盖所有涉及到的类的clone()方法 try{ Employeeemployee_cp=(Employee)employee.clone(); System.out.println("========================="); System.out.println("original对象地址?:"); System.out.println(employee.toString()); System.out.println("copy对象地址?:"); System.out.println(employee_cp.toString()); System.out.println("前后两个对象指向同一地址?:"); System.out.println(employee_cp==employee); System.out.println("========================="); System.out.println("original对象中car对象地址?:"); System.out.println(employee.getcar().toString()); System.out.println("copy对象中car对象地址?:"); System.out.println(employee_cp.getcar().toString()); System.out.println("前后两个car对象指向同一地址?:"); System.out.println(employee_cp==employee); }catch(CloneNotSupportedExceptione){ e.printStackTrace(); } //方法二:序列化实现深拷贝 Employeecloned_employee=SerializedClone.clone(employee); System.out.println("========================="); System.out.println("original对象地址?:"); System.out.println(employee.toString()); System.out.println("copy对象地址?:"); System.out.println(cloned_employee.toString()); System.out.println("前后两个对象指向同一地址?:"); System.out.println(cloned_employee==employee); System.out.println("========================="); System.out.println("original对象中car对象地址?:"); System.out.println(employee.getcar().toString()); System.out.println("copy对象中car对象地址?:"); System.out.println(cloned_employee.getcar().toString()); System.out.println("前后两个car对象指向同一地址?:"); System.out.println(cloned_employee==employee); } }
以上所述是小编给大家介绍的Java中实现深拷贝的两种方式--——clone()&Serialized详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!