对象的克隆有点像C++中的副本构造函数
为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。
在派生类中覆盖基类的clone()方法,并声明为public。
在派生类的clone()方法中,调用super.clone()。
在派生类中实现Cloneable接口。
为什么我们在派生类中覆盖Object的clone()方法时,一定要调用super.clone()呢?在运行时刻,Object中的clone()识别出你要复制的是哪一个对象,然后为此对象分配空间,并进行对象的复制,将原始对象的内容一一复制到新对象的存储空间中。
public static void main(String[] args)
{
Professor p=new Professor("wangwu",50);//注意深层引用
Student s1=new Student("zhangsan",18,p);
Student s2=(Student)s1.clone();
/
s2.p.name="lisi";//***********注意对象的深层克隆,到底是使用引用还是对象本身
s2.p.age=30;
//System.out.println("name="+s1.name+","+"age="+s1.age);
System.out.println("name="+s1.p.name+","+"age="+s1.p.age);
}
class Professor implements Cloneable//***********注意对象的深层克隆
{
String name;
int age;
Professor(String name,int age)
{
this.name=name;
this.age=age;
}
public Object clone()
{
Object o=null;
try
{
o=super.clone();//会抛出异常
}
catch(CloneNotSupportedException e)
{
System.out.println(e.toString());
}
return o;
}
}
class Student implements Cloneable
{
String name;
//************对于这个成员,没有使用克隆,因为String对象是常量,它改变时,在内存中会生成新
//的String对象,然后再把新的对象引用 赋给String变量
int age;
Professor p;//注意深层引用
Student(String name,int age,Professor p)
{
this.name=name;
this.age=age;
this.p=p;
}
public Object clone()
{
//Object o=null;
Student o=null;
try
{
o=(Student)super.clone();//会抛出异常
}
catch(CloneNotSupportedException e)
{
System.out.println(e.toString());
}
o.p=(Professor)p.clone();//*******************************深层克隆
return o;
}
}