易于理解的java中的浅拷贝和深拷贝。

本文详细介绍了Java中浅拷贝和深拷贝的概念,通过浅拷贝示例展示了两者如何共享引用,而深拷贝则通过递归实现对象和内部引用的独立。文章强调了序列化和反序列化在深拷贝中的作用。
摘要由CSDN通过智能技术生成

易于理解的java中的浅拷贝和深拷贝

  在Java中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)也叫深复制和浅复制,是两种不同的对象复制方式,它们的主要区别在于复制对象时是否复制对象内部的引用,也就是是否在拷贝副本之后,对象内的引用变量指向的还是同一块堆空间。

1. 浅拷贝

浅拷贝是指只复制对象本身及其内部的基本数据类型字段,而不复制对象内部的引用类型字段,所以浅拷贝后的对象和原始对象共享引用类型字段指向的对象,即修改其中一个对象的引用类型字段会影响另一个对象。
代码如下:

class Person implements Cloneable {
    private String name;
    private Address address;

    public Person(String name, Address address) {
        this.name = name;
        this.address = address;
    }

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

class Address {
    private String city;

    public Address(String city) {
        this.city = city;
    }
}

public class ShallowCopyExample {
    public static void main(String[] args) {
        Address address = new Address("New York");
        Person person1 = new Person("Alice", address);

        try {
            Person person2 = (Person) person1.clone();
            System.out.println("Original Person: " + person1.address.city);
            System.out.println("Cloned Person: " + person2.address.city);

            // 修改原始对象的地址
            person1.address.city = "Los Angeles";

            System.out.println("Original Person after modification: " + person1.address.city);
            System.out.println("Cloned Person after modification: " + person2.address.city);
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

在上面的代码中,创建了一个 Person 类和一个 Address 类, Person 类包含一个 Address 类型的字段。在 main 方法中,我们对 person1 进行了浅拷贝得到 person2 ,然后修改了 person1 的 address 字段,发现 person2 的 address 字段也被修改了。

2. 深拷贝

深拷贝是指不仅复制对象本身,还复制对象内部的所有引用类型字段,使得复制后的对象和原始对象完全独立,互不影响。 深拷贝一般需要通过序列化、反序列化(对于序列化可以看博主的另一篇博文 Java中的序列化和反序列化详解!!! )或手动递归复制来实现。

手动实现深拷贝代码如下:

class Person implements Cloneable {
    private String name;
    private Address address;

    public Person(String name, Address address) {
        this.name = name;
        this.address = address;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        Person clonedPerson = (Person) super.clone();
        clonedPerson.address = (Address) address.clone();
        return clonedPerson;
    }
}

class Address implements Cloneable {
    private String city;

    public Address(String city) {
        this.city = city;
    }

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

public class DeepCopyExample {
    public static void main(String[] args) {
        Address address = new Address("New York");
        Person person1 = new Person("Alice", address);

        try {
            Person person2 = (Person) person1.clone();
            System.out.println("Original Person: " + person1.address.city);
            System.out.println("Cloned Person: " + person2.address.city);

            // 修改原始对象的地址
            person1.address.city = "Los Angeles";

            System.out.println("Original Person after modification: " + person1.address.city);
            System.out.println("Cloned Person after modification: " + person2.address.city);
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

在上面的示例中,在 Person 类和 Address 类中都实现了 clone() 方法,并在 Person 类的 clone() 方法中对 address 字段进行了深拷贝,从而实现了深拷贝的效果。



上一篇 理解Java的自定义类加载器ClassLoader看这一篇就够了!!!
记得点赞收藏哦!!!
下一篇 Java中的日期时间类详解(建议收藏)!!!
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值