浅克隆与深克隆的区别及特点

浅克隆与深克隆的区别

1、浅克隆:对当前对象进行克隆,并克隆该对象所包含的8种基本数据类型和String类型属性(拷贝一份该对象并重新分配内存,即产生了新的对象);但如果被克隆的对象中包含除8中数据类型和String类型外的其他类型的属性,浅克隆并不会克隆这些属性(即不会为这些属性分配内存,而是引用原来对象中的属性)。
2、深克隆:深克隆是在浅克隆的基础上,递归地克隆除8种基本数据类型和String类型外的属性(即为这些属性重新分配内存而非引用原来对象中的属性)

浅克隆与深克隆的特点

1、被克隆的对象的类应实现 Cloneable 接口,并重写 clone() 方法
2、浅克隆中由于除8中数据类型和String类型外的其他类型的属性不会被克隆,因此当通过新对象对这些属性进行修改时,原对象的属性也会同时改变。而深克隆则已经对这些属性重新分配内存,所以当通过新对象对这些属性进行修改时,原对象的属性不会改变。

代码示例

浅克隆:


public class Dog implements Cloneable{
     
    private int id;  
    private Cat cat;  

    public Cat getcat() {
     
        return cat;  
    }  

    public void setcat(Cat cat) {
     
        this.cat = cat;  
    }  

    public int getId() {
     
        return id;  
    }  

    public void setId(int id) {
     
        this.id = id;  
    }  

    public Dog(int id) {
     
        this.id = id;  
    }  

    @Override  
    protected Object clone() throws CloneNotSupportedException {
     
        return super.clone();  
    }  
}  
public class Cat {
     
    private int id;  
    private String name;  

    public int getId() {
     
        return id;  
    }  

    public void setId(int id) {
     
        this.id = id;  
    }  

    public String getName() {
     
        return name;  
    }  

    public void setName(String name) {
     
        this.name = name;  
    }  

    public Cat(int id,String name) {
     
        this.id = id;  
        this.name = name;  
    }  
}  

测试类:

public class CloneTest {
   
	  
    public static void main(String[] args) throws CloneNotSupportedException {
     
    	Dog dog = new Dog(1);
    	Cat cat = new Cat(1,"jin");
    	dog.setcat(cat);
    	Dog dog2 = (Dog) dog.clone();  
    	//修改dog2的id
    	dog2.setId(2);
    	//修改后与原来的id比较
    	System.out.println("dogId:"+
  • 9
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值