在《Effective Java》中,作者提到:
如果一个类实现了Cloneable接口,那么Object的clone方法会返回一个按字段复制的对象;否则,它会抛出CloneNotSupportedException异常。
我想知道的是,他所说的按字段复制是什么意思。这是否意味着如果该类在内存中占用X个字节,它将只复制那段内存?如果是,那么我可以假设原始类的所有值类型都将被复制到新对象中吗?
如果
如果一个类实现了Cloneable接口,那么Object的clone方法会返回一个按字段复制的对象;否则,它会抛出CloneNotSupportedException异常。
我想知道的是,他所说的按字段复制是什么意思。这是否意味着如果该类在内存中占用X个字节,它将只复制那段内存?如果是,那么我可以假设原始类的所有值类型都将被复制到新对象中吗?
class Point implements Cloneable{
private int x;
private int y;
@Override
public Point clone() {
return (Point)super.clone();
}
}
如果
Object.clone()
所做的是对 Point
类进行逐个字段的复制,那么我认为我不需要显式地复制字段 x
和 y
,因为上面显示的代码将足以克隆 Point
类。也就是说,下面这段代码是多余的:@Override
public Point clone() {
Point newObj = (Point)super.clone();
newObj.x = this.x; //redundant
newObj.y = this.y; //redundant
}
我对吗?
我知道克隆对象的引用会自动指向原始对象引用所指向的位置,但我不确定值类型具体发生了什么。如果有人能清楚地陈述Object.clone()
的算法规范(用简单的语言),那就太好了。