关于浅复制和深复制的理解

⑴浅复制(浅克隆)
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不

复制它所引用的对象。

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实例对象都是单独创建的,即他们的引用对象也在内存里被复制了一份。这就是深复制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值