当前位置: 首页 > 后端技术 > Java

Java基础笔记——对象深浅拷贝

时间:2023-04-01 20:43:20 Java

浅拷贝:基本类型直接拷贝,引用类型拷贝内存地址!【浅拷贝可以通过implimentCloneable直接实现】this.country=country;}//省略get,set@OverridepublicObjectclone(){try{returnsuper.clone();}catch(CloneNotSupportedExceptione){e.printStackTrace();}returnnull;}}publicclassPersonEntityimplementsCloneable{privateStringusername;privateintage;privateAddressEntityaddress;@OverridepublicPersonEntityclone(){try{return(PersonEntity)super.clone();}catch(CloneNotSupportedExceptione){返回null;}}}publicstaticvoidcloneQian(){AddressEntityaddress=newAddressEntity("Hangzhou","China");PersonEntityp1=newPersonEntity("骆家军",24,address);//复制对象PersonEntityp2=p1.clone();//原始对象和复制对象是否相同:System.out.println("原对象和复制对象是否相同:"+(p1==p2));//原对象和复制对象的name属性是否相同System.out.println("原对象和复制对象的name属性是否相同:"+(p1.getUsername()==p2.getUsername()));//原对象和复制对象的subj属性是否相同?System.out.println("原对象和复制对象的subj属性是否相同:"+(p1.getAddress()==p2.getAddress()));p2.setUsername("ccc");p2.getAddress().setCity("宁波");System.out.println("更新原对象:"+p1.getUsername()+"-"+p1.getAddress().getCity());System.out.println("Cloneobjectafterupdatingtheoriginalobject:"+p2.getUsername()+"-"+p2.getAddress().getCity());}深拷贝:复制引用数据类型时,一个新的对象是创建并复制其中的成员变量实现方法:实现cloneable接口,继续使用clone()方法对里面的引用类型变量再执行一次clone(),或者新建一个引用变量赋值和新对象publicPersonEntitydeepClone()throwsinclone()CloneNotSupportedException{PersonEntitypersonClone=(PersonEntity)super.clone();personClone.address=(AddressEntity)this.address.clone();returnpersonClone;}publicstaticvoiddeepClone()throwsCloneNotSupportedException{Address=EntityAddress("杭州实体地址","China");PersonEntityp1=newPersonEntity("骆家军",24,address);PersonEntityp2=p1.deepClone();p1.setAddress(newAddressEntity("宁波","中国"));System.out.println(p2.getAddress());System.out.println(p1.getAddress());//AddressEntity{city='Hangzhou',country='China'}//AddressEntity{city='Ningbo',country='China'}}最重要的代码在PersonEntity.clone()中,它执行另一个clone()操作在里面的地址上!经过序列化和反序列化之后,二进制字节流被序列化内容写入一个介质(文本或字节数组),然后从这个介质中读取数据。原始对象被写入这个介质并且然后复制到克隆对象中。原始对象的修改不会影响克隆对象,因为克隆对象是从这个Media读取的。公共类AddressSearizableEntity实现可序列化{privateStringcity;privateStringcountry;@OverridepublicStringtoString(){return"AddressSearizableEntity{"+"city='"+city+'\''+",country='"+country+'\''+'}';}//省略get、set}publicclassPersonSerializableEntityimplementsSerializable{privateStringusername;privateintage;//省略get、setpublicPersonSerializableEntitymyClone()throwsIOException,ClassNotFoundException{//顺序列表化ByteArrayOutputStreambos=newByteArrayOutputStream();ObjectOutputStreamoos=null;try{oos=newObjectOutputStream(bos);oos.writeObject(这个);}catch(IOExceptione){e.printStackTrace();}//反序列表化ByteArrayInputStreambis=newByteArrayInputStream(bos.toByteArray());ObjectInputStreamois=null;try{ois=newObjectInputStream(bis);}赶上(IOExceptione){e.printStackTrace();}return(PersonSerializableEntity)ois.readObject();}}publicstaticvoidmain(String[]args)throwsCloneNotSupportedException{SpringApplication.run(HouseManageMentApplication.class,args);PersonSerializableEntityp1=newPersonSerializableEntity("roger",24,newAddressSearizableEntity("杭州","中国"));尝试{PersonSerializableEntityp2=p1.myClone();p2.setAddress(newAddressSearizableEntity("宁波","中国"));//AddressSearizableEntity{city='杭州',country='中国'},AddressSearizableEntity{city='宁波',country='中国'}System.out.println(p1.getAddress()+","+p2.getAddress());}catch(IOExceptione){e.printStackTrace();}catch(ClassNotFoundExceptione){e.printStackTrace();}}