简单说就是复制对象,得到一个对象的副本,包含的属性值与原对象的相同。
Object 的 clone() 是 受保护的,且 它本身 不实现 Cloneable接口,所以 当一个类没有实现 Cloneable 接口,就直接调用 super.clone() ——这时是调用的Object的clone() ,是不可以的。会导致抛出 CloneNotSupportedException 异常,需要先实现 Cloneable 接口。
如: class A implements Cloneable { public Object clone() { Object obj=null; obj = super.clone(); return obj } }
main(...){ A a = new A(); A b = (A)a.clone(); }
影子克隆: 若还有个类 class B{..} 当在A 类中有属性 public B b = new B();在克隆后,,会发现,A类中的 一些基本属性 能被真正克隆,即 在改变 克隆得到的对象里的基本属性值时,,原对象不改变,而 在改变 B对象中的属性值 时,,原对象也 改变了,这样,这个克隆 就不是真正的克隆了。
深度克隆: 让 class B也实现Cloneable接口,,实现 clone(), 在A 调用了super.clone()后,,也把它的属性 b = (Clone)b.clone();
这样引用对象和基本对象都 实现了 克隆。
不能克隆的类: String,Integer,Double等等,它们没有实现 Cloneable接口,且 是final 修饰的类。
|