不要以为我得到 .clone()
Don't think I'm getting .clone()
假设我有一个名为 House 的 class,有两个字段:
- 整数区域
- java.util.Date 建成时
我想通过覆盖对象 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
改变另一个房子的日期,所以你必须克隆它们。
假设我有一个名为 House 的 class,有两个字段:
- 整数区域
- java.util.Date 建成时
我想通过覆盖对象 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
改变另一个房子的日期,所以你必须克隆它们。