重定义clone()函数时,如果类有引用字段,那么就必须进行深度克隆。
@Override
public Employee clone() throws CloneNotSupportedException{
Employee e = (Employee)super.clone();
e.hireDay = (Date)hireDay.clone();
return e;
}
如果它是指向列表的链接:
class Класс {
List<Класс2> list;
}
重新定义完成:
Класс e = (Класс)super.clone();
for(int i = 0; i<e.list.size(); i++){
e.list.get(i).clone();
}
return e;
这是对的吗?
该操作
clone将创建一个新对象,该对象具有对相同对象的相同引用。如果你想在列表中有对象的副本,你需要显式地实现它。那些。写下以下内容:列表不分别实现,通过类型变量/字段
Cloneable调用将不起作用。cloneList<T>有
List覆盖的实现clone,例如 ArrayList 和 LinkedList ,但它们不会深度复制列表。那些。他们创建了一个包含相同元素的新列表。来自ArrayList.clone文档
要深度复制列表,您需要遍历所有元素并克隆每个元素。
例如,像这样:
英文版的类似问题:How to clone ArrayList and also clone its contents?