clone对象的特性三点:
1. a.clone() != a:不是同一个实例了。指向不同的内存地址,(在java堆中是两个独立的对象)。
2. a.clone.getClass()== a.getClass():类型一样
3. clone.equals(a):内容一样
前两个特性通过重写 clone方法实现,第三个特性通过重写equals方法实现。
clone最后都会调用object的clone方法,创建一个对象然后一一赋值。对于原始类型跟不可变类型(String,Long...)来说是没有问题的,但是如果是复杂类型比如arraylist的话,那么clone对象跟原始对象会指向同一个对象。就不是真正的clone了。要深度clone。
怎么实现clone:实现接口:Cloneable,重写方法clone,需要抛出异常CloneNotSupportedException,
浅clone:
@Override
protected Rectangle clone() throws CloneNotSupportedException {
return (Rectangle) super.clone();
}
深clone:
@Override
protected Object clone() throws CloneNotSupportedException {
Employee cloned = (Employee)super.clone();
cloned.setDepartment((Department)cloned.getDepartment().clone());
return cloned;
}