浅谈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详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!