JAVA 对象深度复制实现
2016-05-31 11:01
513 查看
JAVA 有两种深度复制实现方式,分别是实现Cloneabel接口,并在接口函数中为每个属性调用Cloneable,也可以通过序列化的方式来实现。
package JAVAImprove; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; //直接复制引用的句柄 //通过序列化实现深度复制。 public class DeepClone implements Cloneable, Serializable{ private transient LearnClone Lc; public LearnClone getLc() { return Lc; } public void setLc(LearnClone lc) { Lc = lc; } //注意序列化是不会调用构造函数的。 public DeepClone(){ System.out.println("Constractor"); Lc = new LearnClone(); } public static void main(String[] args){ DeepClone dc = new DeepClone(); try { DeepClone dc2 = (DeepClone)dc.clone(); System.out.println("dc start:" + dc.getLc().getCheck()); System.out.println("dc2 start:" + dc2.getLc().getCheck()); //深度复制 ByteArrayOutputStream bo = new ByteArrayOutputStream(); try { ObjectOutputStream ot = new ObjectOutputStream(bo); ot.writeObject(dc); ot.close(); ByteArrayInputStream io = new ByteArrayInputStream(bo.toByteArray()); ObjectInputStream ip = new ObjectInputStream(io); //try { DeepClone dc3 = (DeepClone)ip.readObject(); dc3.getLc().setCheck("is Deep Clone"); System.out.println("dc3 end" + dc3.getLc().getCheck()); System.out.println("dc end" + dc.getLc().getCheck()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
package JAVAImprove; import java.io.Serializable; public class LearnClone implements Cloneable, Serializable { private String check = "learn Clone"; public String getCheck() { return check; } public void setCheck(String check) { this.check = check; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } public static void main(String[] args){ // LearnClone cl = new LearnClone(); cl.setCheck("ttt"); LearnClone c2; try { c2 = (LearnClone)cl.clone(); if(c2 == cl){ System.out.println("equal");//首先实现接口可以完成属性的拷贝。 } System.out.println("start cl" + cl.getCheck()); System.out.println("start c2" + c2.getCheck()); //不是一个值 c2.setCheck("aaaaaaaaaaaaaa"); System.out.println("c2" + c2.getCheck()); System.out.println("C1" + cl.getCheck()); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
相关文章推荐
- struts2 拦截器,使用spring注入
- JAVA学习笔记整理六(类集框架)
- springboot多数据源读写分离和主库数据源service层事务控制
- Java 八种排序算法比较实践
- java endian 字节序
- Spring Validation分组校验
- JAVA中&&和&、||和|(短路与和逻辑与、短路或和逻辑或)的区别?
- java代码在页面实现展示pdf文件
- Java socket与JDBC的共用
- 几款Java反编译软件
- 自己实现简单Spring Ioc
- JAVA 加载文件的三种方式的区别
- java 日期转化
- java 日期转化
- java 日期转化
- 学会阅读Java字节码
- 注解
- Spring对Hibernate事务管理
- MyEclipse10.6 myeclipse2013下添加jadClipse反编译插件
- spring-mybatis多数据源配置出错