clone() 方法

clone() 方法用于创建和返回对象的副本。应该避免使用这种方法,因为它有问题,并且应该使用复制构造函数或其他一些复制方法来支持 clone()

对于要使用的方法,调用该方法的所有类都必须实现 Cloneable 接口。

Cloneable 接口本身只是一个标签接口,用于改变 native clone() 方法的行为,该方法检查调用对象类是否实现了 Cloneable。如果调用者没有实现此接口,则会抛出 CloneNotSupportedException

Object 类本身没有实现这个接口,所以如果调用对象是类 Object,则会抛出 CloneNotSupportedException

要使克隆正确,它应该独立于克隆的对象,因此可能需要在返回之前修改对象。这意味着通过复制构成被克隆对象内部结构的任何可变对象来实质上创建深层复制 。如果未正确实现,则克隆对象将不是独立的,并且对可变对象的引用与从其克隆的对象具有相同的引用。这会导致行为不一致,因为对一个行为的任何改变都会影响另一个行为。

class Foo implements Cloneable {
    int w;
    String x;
    float[] y;
    Date z;
    
    public Foo clone() {
        try {
            Foo result = new Foo();
            // copy primitives by value
            result.w = this.w;
            // immutable objects like String can be copied by reference
            result.x = this.x;
            
            // The fields y and z refer to a mutable objects; clone them recursively.
            if (this.y != null) {
              result.y = this.y.clone();
            }
            if (this.z != null) {
              result.z = this.z.clone();
            }
            
            // Done, return the new object
            return result;
            
        } catch (CloneNotSupportedException e) {
            // in case any of the cloned mutable fields do not implement Cloneable
            throw new AssertionError(e);
        }
    }
}