Java中深拷贝和浅拷贝是什么

在Java中,深拷贝和浅拷贝是用来描述对象复制的两种方式,它们在复制对象时处理引用类型属性的方式不同。

  1. 浅拷贝(Shallow Copy):

    • 浅拷贝只复制对象的基本数据类型字段和引用字段的引用,而不复制引用对象所指向的数据。当你对一个对象做浅拷贝时,新的对象和原始对象会引用同一块内存地址中的子对象。也就是说,对新的对象中引用子对象的修改,也会影响到原始对象的子对象。
    • 在Java中,使用Object类的clone()方法可以实现浅拷贝,前提是类实现了Cloneable接口。
    • 示例代码:
class Address {  
    String city;  

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

class Person implements Cloneable {  
    String name;  
    Address address;  

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

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

public class Main {  
    public static void main(String[] args) throws CloneNotSupportedException {  
        Address address = new Address("New York");  
        Person person1 = new Person("John", address);  
        Person person2 = (Person) person1.clone();  

        // 修改person2的地址  
        person2.address.city = "Los Angeles";  

        // person1的地址也会受到影响  
        System.out.println(person1.address.city); // 输出: Los Angeles  
    }  
}

2.深拷贝(Deep Copy):

  • 深拷贝不仅复制对象的基本数据类型字段,还会创建新的实例并递归复制所有引用类型字段。这样,新的对象和原始对象就完全独立,修改一个对象不会影响另一个对象。
  • 实现深拷贝通常需要手动编写代码来复制引用对象的内容,或者使用序列化和反序列化的方式来实现。
  • 示例代码:
class Address {  
    String city;  

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

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

class Person {  
    String name;  
    Address address;  

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

    public Person deepCopy() {  
        return new Person(this.name, this.address);  
    }  
}  

public class Main {  
    public static void main(String[] args) {  
        Address address = new Address("New York");  
        Person person1 = new Person("John", address);  
        Person person2 = person1.deepCopy();  

        // 修改person2的地址  
        person2.address.city = "Los Angeles";  

        // person1的地址不受影响  
        System.out.println(person1.address.city); // 输出: New York  
    }  
}

总结来说,浅拷贝只复制对象的引用,而深拷贝则是创建新对象并递归复制所有字段。选择使用哪种拷贝方式应根据实际需求来决定。

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值