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()。通过进行一次准确的复制,
这样做可为后续的克隆进程建立起一个良好的基础。随后,可采取另一些必要的操作,以完成最终的
克隆。