java的深拷贝与浅拷贝有什么不同吗

Java的深拷贝与浅拷贝有什么不同

在Java中,对象复制是一个重要的概念,当我们需要创建一个对象的副本时,可能会遇到两种不同的复制方式:浅拷贝和深拷贝,这两种复制方式的主要区别在于它们复制对象的方式不同,下面我们来详细了解一下这两种复制方式的特点和区别。

java的深拷贝与浅拷贝有什么不同吗

浅拷贝

1、什么是浅拷贝?

浅拷贝是指创建一个新对象,然后将原对象的非静态字段复制到新对象中,如果字段是值类型的,那么它们的值将被复制;如果字段是引用类型的,那么将创建一个新的引用指向原对象的引用类型字段,需要注意的是,浅拷贝不会递归地复制引用类型的子对象。

2、浅拷贝的特点

只复制对象的非静态字段,不复制静态字段和final字段。

如果字段是值类型的,那么它们的值将被复制;如果字段是引用类型的,那么将创建一个新的引用指向原对象的引用类型字段。

浅拷贝不会递归地复制引用类型的子对象。

java的深拷贝与浅拷贝有什么不同吗

3、浅拷贝的实现方法

在Java中,可以通过实现Cloneable接口并重写Object类的clone()方法来实现浅拷贝,示例代码如下:

class Person implements Cloneable {
    String name;
    int age;
    Child child;
    public Person(String name, int age, Child child) {
        this.name = name;
        this.age = age;
        this.child = child;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

深拷贝

1、什么是深拷贝?

深拷贝是指创建一个新对象,并将原对象的非静态字段以及其引用类型的子对象都复制到新对象中,与浅拷贝不同的是,深拷贝会递归地复制引用类型的子对象。

2、深拷贝的特点

不仅复制对象的非静态字段,还复制静态字段和final字段。

java的深拷贝与浅拷贝有什么不同吗

如果字段是值类型的,那么它们的值将被复制;如果字段是引用类型的,那么将创建一个新的引用指向原对象的引用类型字段,深拷贝还会递归地复制引用类型的子对象。

深拷贝要求被复制的对象及其子对象必须实现Cloneable接口。

3、深拷贝的实现方法(使用序列化)

在Java中,可以通过实现Serializable接口并重写Object类的clone()方法来实现深拷贝,示例代码如下:

class Person implements Serializable {
    String name;
    int age;
    Child child;
    public Person(String name, int age, Child child) {
        this.name = name;
        this.age = age;
        this.child = child;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person person = (Person) super.clone(); // 调用父类的clone方法实现浅拷贝
        person.child = (Child) child.clone(); // 递归地复制引用类型的子对象(深拷贝)
        return person;
    }
}

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/157614.html

(0)
K-seoK-seoSEO优化员
上一篇 2023年12月22日 12:58
下一篇 2023年12月22日 13:01

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入