⑴浅复制(浅克隆)
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不
复制它所引用的对象。
eg:比如有一个Student类和一个Teacher类
<p>public class Student implements Cloneable{
private String name;
private String num;
Teacher teacher;
public Student(String name,String num,Teacher t){
this.name=name;
this.num=num;
this.teacher=t;
}
public String getName() {
return name;
}</p><p> public void setName(String name) {
this.name = name;
}</p><p> public String getNum() {
return num;
}</p><p> public void setNum(String num) {
this.num = num;
}</p><p>public static void main(String [] args) throws CloneNotSupportedException{
Teacher t=new Teacher("张三", 30);
Student s=new Student("小明","1111",t);
Student s1=(Student) s.clone();
s1.teacher.name="李四";
System.out.println(s.teacher.name+" "+s1.teacher.name);
}
}
class Teacher
{
String name;
int age;
Teacher(String name,int age)
{
this.name=name;
this.age=age;
}
}</p>
由于上面的s.clone属于浅复制,即没有对Student类里面聚合了的Teacher类的实例对象进行复制,该对象的引用仍然指向原来的对象,所以当实例s1将老师的名字改为“李四”后实例s老师的名字也变成了“李四”。
⑵深复制(深克隆)
被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原
有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
eg:对上述两个类进行修改:
public class Student implements Cloneable{
private String name;
private String num;
Teacher teacher;
public Student(String name,String num,Teacher t){
this.name=name;
this.num=num;
this.teacher=t;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
public Object clone()
{
Student o=null;
try
{
o=(Student)super.clone();
}
catch(CloneNotSupportedException e)
{
System.out.println(e.toString());
}
o.teacher=(Teacher)teacher.clone();
return o;
}
public static void main(String [] args) throws CloneNotSupportedException{
Teacher t=new Teacher("张三", 30);
Student s=new Student("小明","1111",t);
Student s1= (Student) s.clone();
s1.teacher.name="李四";
System.out.println(s.teacher.name+" "+s1.teacher.name);
}
}
class Teacher implements Cloneable
{
String name;
int age;
Teacher(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;
}
}
由于在Student类里面重写了clone方法,对类里面Teacher类的实例也进行了克隆,创建了一个新的Teacher对象,从而实现了当s1改变老师的名字为“李四”时,不影响s的老师的名字,因为两个Student对象里面的Teacher实例对象都是单独创建的,即他们的引用对象也在内存里被复制了一份。这就是深复制。