引用拷贝、浅拷贝、深拷贝

  • 引用拷贝:引用拷贝就是两个不同的引用指向同一个对象。
  • 浅拷贝:浅拷贝会在堆上创建一个新的对象(不同于引用拷贝的一点),如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址(不会创建新的内部对象),拷贝对象和原对象共用同一个内部对象。
  • 深拷贝:深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。
    在这里插入图片描述

例子:

引用拷贝:

Address 类(作为 Person 的引用类型属性)
public class Address{
    private String place;

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

    public String getPlace() {
        return place;
    }

    public void setPlace(String place) {
        this.place = place;
    }
}
Person 类(含引用类型属性 Address)
public class Person{
    private Address address;

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

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}
验证

Person Person1 = new Person(new Address("巢都"));
Person Person1Copy = Person1.clone();
//true
System.out.println(Person1 == Person1Copy);
//true
System.out.println(Person1.getAddress() == Person1Copy.getAddress())

结果:

在这里插入图片描述

在这里插入图片描述

浅拷贝:

实现 Cloneable 接口,并重写了 clone() 方法。
clone() 方法的实现:直接调用的是父类 Objectclone() 方法。

Address 类(作为 Person 的引用类型属性)
public class Address implements Cloneable{
    private String place;
    
    public Address(String place) {
        this.place = place;
    }

    public String getPlace() {
        return place;
    }

    public void setPlace(String place) {
        this.place = place;
    }

    @Override
    public Address clone() {
        try {
            return (Address) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}
Person 类(含引用类型属性 Address)
public class Person implements Cloneable{
    private Address address;

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

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    public Person clone() {
        try {
            return (Person) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }

   
}

验证

Person Person1 = new Person(new Address("巢都"));
Person Person1Copy = Person1.clone();
//false
System.out.println(Person1 == Person1Copy);
//true
System.out.println(Person1.getAddress() == Person1Copy.getAddress())
    

结果:在这里插入图片描述

在这里插入图片描述

深拷贝:

Person 类的 clone() 方法进行修改,连带着要把 Person 对象内部的 Address 对象一起复制。

Person 类的 clone() 方法
@Override
    public Person clone() {
        try {
            Person clone = (Person) super.clone();
            clone.setAddress(clone.getAddress().clone());
            return clone;
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
验证

Person Person1 = new Person(new Address("巢都"));
Person Person1Copy = Person1.clone();
//false
System.out.println(Person1 == Person1Copy);
//false
System.out.println(Person1.getAddress() == Person1Copy.getAddress());
    

结果:

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值