为什么阿里Java手册推荐慎用 Object 的 clone 方法来拷贝对象

本文探讨了Java中对象拷贝的浅拷贝和深拷贝概念,指出慎用`Object.clone()`方法,因为它默认执行浅拷贝。通过实例展示了浅拷贝可能导致的问题,并介绍了如何通过覆写`clone`方法实现深拷贝。此外,文章推荐使用序列化方式实现深拷贝,以避免手动处理引用类型带来的复杂性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在阿里Java开发手册中,有这么一条建议:慎用 Object 的 clone 方法来拷贝对象。对象 clone 方法默认是浅拷贝,若想实现深拷贝需覆写 clone 方法实现域对象的深度遍历式拷贝 。Java中的对象拷贝,有浅拷贝和深拷贝两种,如果没有搞清楚这两者的区别,那么可能会给自己的代码埋下隐患。

什么是浅拷贝和深拷贝

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

深拷贝:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。

通过上面的结论,我们可以看出浅拷贝和深拷贝的区别就在于所要拷贝的对象的引用数据类型,如果是拷贝一份引用,那么这是浅拷贝,如果是新建一个对象,那么这就是深拷贝。

clone方法

在Java的Object对象中,有clone这个方法。它被声明为了 protected,所以我们可以在其子类中使用它。这里需要注意的是,我们在子类中使用clone方法时,子类需要实现Cloneable接口,否则会抛出java.lang.CloneNotSupportedException异常。

有如下对象

如下实体类都使用了Lombok。

Address.java

@Data
public class Address {
   

    private String address;

}

Person.java

@Data
public class Person implements Cloneable {
   

    private String name;

    private Integer age;
    
    private Address address;

    @Override
    protected Object clone() throws CloneNotSupportedException {
   
        return super.clone();
    }
}

浅拷贝

浅拷贝,示例代码如下:

public static void main(String[] args) throws CloneNotSupportedException {
   
    Person person = new Person();
    person.setName("Happyjava");
    person.setAge(33
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值