Java中对象的克隆
1) 为了获取对象的一份拷贝,可以利用Object类的clone()方法。
2) 在派生类中覆盖基类的clone()方法,并声明为public。
3) 在派生类的clone()方法中,调用super.clone()。
4) 在派生类中实现Cloneable接口。
5) 为什么在派生类中覆盖Object的clone()方法时,一定要调用super.clone()呢?在运行时刻,Object中的clone()识别出你要复制的是哪一个对象,然后为此对象分配空间,并进行对象的复制,将原始对象的内容一一复制到新对象的存储空间中。
以下代码为Student类实现克隆,首先其必须实现Cloneable接口,如果不实现此接口,则会在调用clone方法时抛出CloneNotSupportedException异常,Cloneable接口中无任何抽象方法。然后重写clone方法。
class Student implements Cloneable
{
String name;
int age;
Professor p;
Student(String name,int age,Professor p)
{
this.name=name;
this.age=age;
this.p=p;
}
public String toString()//重写toString方法,可以直接打印Student对象
{
return "name="+this.name+",age="+this.age+","+this.p;
}
public Object clone ()
{
Object o=null;
try
{
o=super.clone();
}
catch(CloneNotSupportedException e)
{
System.out.println(e.toString());
}
return o;
}
}
class Professort
{
String name;
int age;
Professor(String name,int age)
{
this.name=name;
this.age=age;
}
public String toString()//重写toString方法,可以直接打印Professor对象
{
return "professor="+this.name+","+this.age;
}
}
在主函数中即可用以下代码来实现克隆:
Professor p=new Professor("wangwu",50);
Student st=new Student("zhangshan",20,p);
Student st1=(Student)st.clone();
此时还可以为st1对象单独赋值,而不改变st的值
st1.name="lisi";
st1.age=23;
但是如果使用下面代码为st1中的Professor p赋值,由于Professor p为一个对象,为引用拷贝,故此时st和st1中的p的name和age均变成修改后的。
st1.p.name="zhouxiao";
st1.p.age=40;
如果要使得st中p的name和age不随st1中p的name和age值的改变,则必须对Professor类实现克隆方法,修改代码如下:
class Professor implements Cloneable
{
String name;
int age;
Professor(String name,int age)
{
this.name=name;
this.age=age;
}
public String toString()
{
return "professor="+this.name+","+this.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;
int age;
Professor p;
Student(String name,int age,Professor p)
{
this.name=name;
this.age=age;
this.p=p;
}
public String toString()
{
return "name="+this.name+",age="+this.age+","+this.p;
}
public Object clone ()
{
Student o=null;
try
{
o=(Student)super.clone();
}
catch(CloneNotSupportedException e)
{
System.out.println(e.toString());
}
o.p=(Professor)p.clone(); //实现p的克隆
return o;
}
}