该clone()方法用于创建和返回对象的副本。应避免使用这种有争议的方法,因为它存在问题,应使用复制构造函数或其他复制方法来代替clone()。
为了使用该方法,所有调用该方法的类都必须实现该Cloneable接口。
该Cloneable接口本身只是用来改变行为的标签接口native clone(),如果调用对象的类实现的检查方法Cloneable。如果调用者未实现此接口,CloneNotSupportedException则将引发a。
在Object类本身不实现这个接口所以CloneNotSupportedException如果调用对象是类的将被抛出Object。
为了使克隆正确,克隆应该独立于要克隆的对象,因此可能需要在返回对象之前对其进行修改。这实际上意味着通过复制构成要克隆对象内部结构的任何可变对象来创建“深层副本” 。如果未正确实施此操作,则克隆的对象将不会独立,并且与从其克隆的对象对可变对象的引用相同。这将导致行为不一致,因为对其中一个进行的任何更改都会影响另一个。
class Foo implements Cloneable { int w; String x; float[] y; Date z; public Foo clone() { try { Foo result = new Foo(); // 按值复制基元 result.w= this.w; // 诸如String之类的不可变对象可以通过引用复制 result.x= this.x; //字段y和z表示可变对象;递归克隆它们。 if (this.y != null) { result.y= this.y.clone(); } if (this.z != null) { result.z= this.z.clone(); } // 完成,返回新对象 return result; } catch (CloneNotSupportedException e) { // 如果任何克隆的可变字段未实现Cloneable throw new AssertionError(e); } } }