public class ObjectClone implements Cloneable { private int i; private Handler handler = new Handler(101, "chenzq"); public ObjectClone(int i) { this.i = i; } public void increase() { this.i++; } public void changeHandler(String str) { this.handler.setStr(str); } public int getI() { return this.i; } public Handler getHandler() { return this.handler; } @Override public Object clone() { ObjectClone o = null; try { o = (ObjectClone) super.clone(); } catch (CloneNotSupportedException ex) { ex.printStackTrace(); } o.handler = (Handler) o.handler.clone(); return o; } public static void main(String[] args) { ObjectClone o = new ObjectClone(100); ObjectClone oc = (ObjectClone) o.clone(); o.increase(); System.out.println("o.i = " + o.getI() + ", oc.i = " + oc.getI()); o.changeHandler("jaesonchen"); System.out.println("o.handler = " + o.handler); System.out.println("oc.handler = " + oc.handler); } } class Handler implements Cloneable { private int j = 100; private String str = "default"; public Handler() { } public Handler(int j, String str) { this.j = j; this.str = str; } public void setStr(String str) { this.str = str; } @Override public Object clone() { Object o = null; try { o = super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return o; } @Override public String toString() { return "Handler.j = " + j + ", Handler.str = " + str; } }
输出为:
o.i = 101, oc.i = 100
o.handler = Handler.j = 101, Handler.str = jaesonchen
oc.handler = Handler.j = 101, Handler.str = chenzq
* Object.clone()会检查原先的对象有多大,再为新对象腾出足够多的内存,将所有二进制位从原来的对象
复制到新对象。
* 对于基本数据类型,直接复制,对于引用类型,如果引用类型或其基类实现了Cloneable接口,则调用
该对象的clone复制引用类型对象, 如果没有实现Cloneable接口,则直接复制对象句柄,实际上复制后
的对象和原对象指向同一个引用类型。
* 类或者基类必须实现标志空接口Cloneable,否则在调用clone方法时会抛出
CloneNotSupportedException异常。
* 克隆时要注意的两个关键问题是:几乎肯定要调用super.clone(),以及注意将克隆设为public。
* 调用Object.clone()时,根类中的clone()方法负责建立正确的存储容量,并通过“按位复制”
二进制位从原始对象中复制到新对象的存储空间。也就是说,它并不只是预留存储空间以及复制
一个对象 —— 实际需要调查出欲复制之对象的准确大小,然后复制那个对象。
* 不管我们要做什么,克隆过程的第一个部分通常都应该是调用super.clone()。通过进行一次准确的复制,
这样做可为后续的克隆进程建立起一个良好的基础。随后,可采取另一些必要的操作,以完成最终的
克隆。