这是我通过示例理解对象克隆的方式:
import java.util.GregorianCalendar;
public class CloneType1 {
public static void main(String[] args) {
GregorianCalendar obj = new GregorianCalendar();
GregorianCalendar objCopy = (GregorianCalendar) obj.clone();
System.out.println(obj.getTime());
System.out.println(objCopy.getTime());
}
}
使用这种实现克隆的方式有什么好处:
public class UsingCloneable implements Cloneable {
int rollno;
String name;
public UsingCloneable(int rollno,String name) {
this.rollno=rollno;
this.name=name;
}
public Object clone()throws CloneNotSupportedException{
return super.clone();
}
public static void main(String[] args) {
try {
UsingCloneable obj = new UsingCloneable(45, "SuperMan");
UsingCloneable objCopy = (UsingCloneable) obj.clone();
System.out.println(obj.name+"\t"+obj.rollno);
System.out.println(objCopy.name+"\t"+objCopy.rollno);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:1)
使用这种实现克隆的方式有什么好处
在您的实现中返回Object.clone()(或super.clone())没有多大意义。你需要做的是创建所有可变字段的新实例,并将它们设置为你的新实例化对象的字段。让我们为您的示例添加一个字段:
public class UsingCloneable implements Cloneable {
int rollno;
String name;
List list;
如果您没有深度克隆列表字段,则更改列表内容将同时应用于原始列表和克隆字段。这是可能的实现
public UsingCloneable clone()throws CloneNotSupportedException{
UsingCloneable clone = new UsingCloneable (rollno, name);
clone.list = new ArrayList(list);
return clone;
}
基本上所有可变类型都需要深度克隆,否则你将在克隆之间共享它们的实例