要实现对象间的Clone操作,首先,自定义类是没有默认的Clone方法的,必须要继承Cloneable这个接口来重载Clone方法,如下:
public class KinderGardenStu extends Student implements GamePlayable,Cloneable
{
@Override
public KinderGardenStu clone() throws CloneNotSupportedException
{
// TODO Auto-generated method stub
return (KinderGardenStu)super.clone();
}
}
下面使用,注意需要用try catch包围住clone操作,因为可能复制失败。
public static void main(String[] args)
{
Student primaryStudent = new PrimaryStu();
KinderGardenStu kindeStudent = new KinderGardenStu();
kindeStudent.setAge("12 year old");
MathCourse mathCourse = new MathCourse();
mathCourse.setCourseName("cool math");
kindeStudent.stuCourse = mathCourse;
KinderGardenStu kStudent = kindeStudent.clone();
//注意,值类型的不会变,也就是说,浅拷贝不会对值类型产生影响
kStudent.setAge("13 year old");
kStudent.stuCourse.setCourseName("not cool math");
//变化了,说明浅拷贝会对引用类型产生影响
System.out.println(kindeStudent.stuCourse.getCourseName());
}
Clone方法生成一个对象的时候,不会执行构造方法,而只是内存中进行数据块的复制,这就是浅拷贝,缺点是:基本类型是值复制,对象是地址拷贝,也就是说,如果源对象数据改变了,那么Clone的对象的内容也会改变,这样会造成潜在的bug。结论:除非必要,否则不要拷贝对象,即使是拷贝,也要进行深拷贝。