1. clone介绍
Java的所有类都默认继承java.lang.Object类,在java.lang.Object类中有一个方法clone()。JDK API的说明文档解释这个方法将返回Object对象的一个拷贝,拷贝对象返回的是一个新对象,而不是一个引用。
2. clone方法的实现
(1)实现Cloneable接口
要实现clone方法必须实现Cloneable接口,否则会报CloneNotSupportedException异常。
但查看Cloneable接口的源码,没有定义任何一个方法。其实Cloneable接口相当于一个标示,该类可以调用clone方法。(设计原理及设计细节稍后补充)
(2)重写clone()方法
clone方法是在Object种定义的,而且是protected型的,为了让其它类能调用这个clone 类的clone()方法,重载之后要把clone()方法的属性设置为public。
Object中默认的实现是一个浅拷贝,也就是表面拷贝,只拷贝了对象本身,如果含有对象成员,则只复制了一份对象成员的引用,导致克隆后的对象与原对象指向同一个数据成员。若想解决此问题,需要实现深层次拷贝,调用成员对象的克隆方法。
public class A implements Cloneable { public String name[]; public A(){ name=new String[2]; } public Object clone() { A o = null; try { o = (A) super.clone(); o.name=(String[])name.clone();//进行成员对象克隆 } catch (CloneNotSupportedException e) { e.printStackTrace(); } return o; } }
(3)String对象在clone方法中的特殊性
String对象不需要执行自身的克隆方法,这与String对象的存储形式有关。(具体参考:java基础类型:String)