clone的一知半解-Java
来源:互联网 发布:平面设计软件有哪些 编辑:程序博客网 时间:2024/06/11 12:04
Java中要实现clone必须实现Cloneable接口,并重写clone方法。但是惊奇的发现接口中居然空无一物,clone方法是在Object中就有定义的。
像Cloneable这样的接口被称作标记接口,其意义是:以接口的形式标记对象是否拥有某种能力。这也是接口的一种作用,为某种规范而存在(个人理解,有看法可讨论)。关于标记相关,详见:http://www.cnblogs.com/xinhuaxuan/p/6349165.html
clone分 深clone和浅clone。
Java中Object实现的克隆为浅克隆,若对象A中有其他对象P,则若A 中的对象P发生改变时,其克隆对象A`中的P也会改变,因为其使用的引用指向同一个对象。
若想实现深克隆,需重写clone方法。可以采用序列化的方式,使用对象流实现。但被克隆对象需要实现Serializable接口
package lc.clone.deep;import java.io.Serializable;//要实现深克隆必须实现Serializable接口 public class DeepClone implements Serializable{ private int a; private String b; private int[] c; public int getA() { return a; } public void setA(int a) { this.a = a; } public String getB() { return b; } public void setB(String b) { this.b = b; } public int[] getC() { return c; } public void setC(int[] c) { this.c = c; }}
测试类:
package lc.clone.deep;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;public class Test{ public static void main(String[] args) throws CloneNotSupportedException { Test t = new Test(); DeepClone dc1 = new DeepClone(); // 对dc1赋值 dc1.setA(100); dc1.setB("clone1"); dc1.setC(new int[] { 1000 }); System.out.println("克隆前: dc1.a=" + dc1.getA()); System.out.println("克隆前: dc1.b=" + dc1.getB()); System.out.println("克隆前: dc1.c[0]=" + dc1.getC()[0]); System.out.println("-----------"); DeepClone dc2 = (DeepClone) t.deepClone(dc1); // 对c2进行修改 dc2.setA(50); dc2.setB("clone2"); int[] a = dc2.getC(); a[0] = 500; dc2.setC(a); System.out.println("克隆前: dc1.a=" + dc1.getA()); System.out.println("克隆前: dc1.b=" + dc1.getB()); System.out.println("克隆前: dc1.c[0]=" + dc1.getC()[0]); System.out.println("-----------"); System.out.println("克隆后: dc2.a=" + dc2.getA()); System.out.println("克隆后: dc2.b=" + dc2.getB()); System.out.println("克隆后: dc2.c[0]=" + dc2.getC()[0]); } // 用序列化与反序列化实现深克隆 public Object deepClone(Object src) { Object o = null; try { if (src != null) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(src); oos.close(); ByteArrayInputStream bais = new ByteArrayInputStream(baos .toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); o = ois.readObject(); ois.close(); } } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return o; }}
测试结果如下:
结果:
克隆前: dc1.a=100
克隆前: dc1.b=clone1
克隆前: dc1.c[0]=1000
-----------
克隆前: dc1.a=100
克隆前: dc1.b=clone1
克隆前: dc1.c[0]=1000
-----------
克隆后: dc2.a=50
克隆后: dc2.b=clone2
克隆后: dc2.c[0]=500
克隆前: dc1.a=100
克隆前: dc1.b=clone1
克隆前: dc1.c[0]=1000
-----------
克隆前: dc1.a=100
克隆前: dc1.b=clone1
克隆前: dc1.c[0]=1000
-----------
克隆后: dc2.a=50
克隆后: dc2.b=clone2
克隆后: dc2.c[0]=500
详见:http://blog.csdn.net/liuchao1211/article/details/3277955
关于可序列化内容,日后更新学习。
阅读全文
0 0
- clone的一知半解-Java
- java mail 的一知半解
- java虚拟机(一知半解)
- 性能优化的一知半解
- MYSQL的一知半解
- 对于plist的一知半解
- 关于OpenWrt的一知半解
- vue一知半解的总结
- 关于NMDS的一知半解
- 浅谈Java的Clone
- java 的clone方法
- Java的clone机制
- java 的clone
- 关于Java的clone()
- 理解java的clone
- java里的clone
- JAVA的Clone
- Java的clone方法
- 染色问题的俩解法
- 深度摄像头测距原理简介
- sudo 命令直接添加密码到脚本
- 统计查询两列相同的sql语句
- Android自定义注解与注解器实现点击事件绑定
- clone的一知半解-Java
- [主机更新]更新主机以及IP
- 欢迎使用CSDN-markdown编辑器
- PTA 7-11(图) 公路村村通(30 分) 最小生成树prim
- leetcode题解-81 Search in Rotated Sorted Array II
- 创业团队欢迎你的加入
- fastlane Xcode9 The call to the iTMSTransporter completed with a non-zero exit status: 1. This indic
- 怎么将项目在Eclipse中生成doc文档
- TreeMap 排序