clone 方法


Cloneable 接口:

  • 实现 Cloneable 接口的类表明 clone 方法会返回该对象的一个逐域拷贝(field-for-field copy)的实例。
  • 在一个未实现 Cloneable 接口的类上调用 clone 方法会抛出 CloneNotSupportedException 异常。
  • 实现 Cloneable 接口的类应该用一个public方法重写 Object 的 clone 方法(protected)。
  • Cloneable 接口并没有提供一个 clone 方法,因此并不能因为类实现了此接口就可以调用 clone 方法。

clone 方法的通用约定:

  • x.clone() != x 为 true。
  • x.clone().getClass() = x.getClass() 为 true。
  • x.clone().equals(x) 为 true。
  • 拷贝过程中没有调用构造方法。

clone 方法相当于一个构造方法,不能因为调用 clone 方法而对原始对象造成影响。

  • 如果原始对象中仅包含原始类型,那么 clone 能得到一个功能完整的对象。
  • 如果原始对象中包含一些可变对象,那么必须对这些对象循环调用 clone 方法,保证克隆对象没有引用原始对象中的数据。
  • clone 方法和可变对象的 final 域的正常方法是不兼容的。
  • 在线程安全的类实现 Cloneable 接口,必须保证 clone 方法也是线程安全的。