不要以为我得到 .clone()

Don't think I'm getting .clone()

假设我有一个名为 House 的 class,有两个字段:

我想通过覆盖对象 class:

中的克隆方法,使用 clone() 执行此 class 的深层复制
public Object clone() throws CloneNotSupportedException {
    // Perform a shallow copy
    House houseClone = (House)super.clone();
    
    // Deep copy on whenBuilt
    houseClone.whenBuilt = (java.util.Date)(whenBuilt.clone());
    
    return houseClone;
}

显然上面的代码是应该如何完成的。我不明白的是:写 whenBuilt.clone() 不是做 Date 对象的浅拷贝而不是深拷贝吗?换句话说,我的 houseClone 的 whenBuilt 字段不会仍然引用我原来的 House class 及其 whenBuilt 字段吗?我的理解是,默认情况下,所有克隆方法都不会进行深拷贝。我没有得到什么?

该实例包含两个值。您需要将这些值从原始实例复制到新实例。它更像是:

public Object clone() throws CloneNotSupportedException {
    // Perform a shallow copy
    House houseClone = (House)super.clone();
    
    // Deep copy on whenBuilt and area
    houseClone.whenBuilt = (java.util.Date)(this.whenBuilt.clone());
    houseClone.area = this.area;
     
    return houseClone;
}

我们知道日期是一个非常简单的对象,您可以使用旧日期的时间值构造一个新日期,但是如果 Date 上的克隆方法有效,那么它通常更适合使用它。

Doesn't writing whenBuilt.clone() do a shallow copy of the Date object and not a deep copy?

克隆用于深拷贝。显然准确的意思取决于class。它应该给你另一个实例,它具有所有相同的值,但是是一个不同的实例。如果您检查 Date class 的代码,您会发现它只包含一个 long 值,因此 Date class.

的浅层和深层之间没有真正的区别

如果您不对 Date 对象进行克隆,那么原始对象和克隆对象这两个 House 对象将指向同一个 Date 实例。克隆操作将为您提供一个新的 Date 实例,其中包含相同的日期值。 Date 对象有 mutator 方法,比如 setDate,你不希望一个房子的 setDate 改变另一个房子的日期,所以你必须克隆它们。