Java深拷贝和浅拷贝

Java的对象拷贝是指实现了Cloneable接口的对象调用clone()方法来创建新的对象的方式。
该函数会创建该类的新实例,并初始化所有属性对象。属性对象本身并不会自动调用 ,因此此方法实现的是浅拷贝而不是深拷贝。

因此我们可以了解到,浅拷贝将返回该类的新的实例,该实例的引用类型对象共享。

拷贝也会返回该类的新的实例,但是该实例的引用类型属性也是拷贝的新对象。

浅拷贝和深拷贝的主要区别在于对于引用类型是否共享。
在这里插入图片描述
如何实现深拷贝呢?
方法1:手动实现,重写clone方法的实现

@Data
public class Dog implements Cloneable{
    public String spice;
    public Address address;

    public Dog clone() throws CloneNotSupportedException {
        Dog dog=(Dog) super.clone();        
        dog.setAddress(new Address(dog.getAddress().getName()));
        return dog;
    }
}

此时生成的对象内部的引用对象是新生成的对象

   @Test
    public void testClone() throws CloneNotSupportedException {
        Dog dog=new Dog();
        dog.setSpice("wang");
        dog.setAddress(new Address("beijing"));
        Dog dog1=dog.clone();
        //false
        System.out.println(dog.address==dog1.address);
    }

方法2:利用序列化和反序列化的方式来生成新对象

@Data
public class Dog implements Cloneable{
    public String spice;
    public Address address;

    public Dog clone() throws CloneNotSupportedException {
        Dog dog=(Dog) super.clone();
        String json= JSON.toJSONString(dog);
        Dog dog1=JSON.parseObject(json,Dog.class);
        return dog1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值