Java中对象拷贝,对象的浅拷贝、对象的深拷贝

什么是对象拷贝?对象的浅拷贝、对象的深拷贝?

对象的拷贝的说明

Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去。

  • 例:比如,对象A和对象B都属于类C,具有属性a和b。那么对对象A进行拷贝操作赋值给对象B就是:B.a=A.a; B.b=A.b;

拷贝对象,主要是为了在新的上下文环境中复用现有对象的部分或全部 数据。

Java中的对象拷贝主要分为:浅拷贝(Shallow Copy)、深拷贝(Deep Copy)

铺垫知识:Java中的数据类型分为基本数据类型和引用数据类型。对于这两种数据类型,在进行赋值操作、用作方法参数或返回值时,会有值传递和引用(地址)传递的差别。

浅拷贝

浅拷贝(Shallow Copy)

  • 对于基本数据类型的成员变量,浅拷贝进行的是值传递,也就是将对象A中的基本数据类型的成员变量的值赋值给对象B中的同等基本数据类型的成员变量。因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,不会影响另一个对象拷贝得到的数据
  • 对于数据类型是引用类型的成员变量,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址)复制一份给新的对象。因为实际上两个对象的该成员变量都指向同一个实例。在这种情况下,在一个对象中修改该成员变量会影响到另一个对象的该成员变量值。

浅拷贝示例图:
在这里插入图片描述

以下两种方法实现浅拷贝

1.使用类的构造器实现浅拷贝

拷贝构造器指的是该类的构造器参数为该类的对象。使用拷贝构造器可以很好地完成浅拷贝,直接通过一个现有的对象创建出与该对象属性相同的新的对象。
代码:

public class ObjectShallowCopyByConstructor {
   


    public static void main(String[] args) {
   

        //**************通过类的构造器浅拷贝对象**************
        Person personZhang = new Person("张三", 22, new Occupation("程序员",8000));
        Person personLi = new Person(personZhang);
        System.out.println("=====改变值前=====");
        System.out.println(personZhang.getOccupation().hashCode());
        System.out.println(personZhang);
        System.out.println(personLi.getOccupation().hashCode());
        System.out.println(personLi);
        System.out.println("=====改变值后=====");
        personZhang.setAge(30);
        personZhang.setName("李四");
        personZhang.getOccupation().setOccName("厨师");   //改变personZhang的Occupation的occName
        System.out.println(personZhang.getOccupation().hashCode());
        System.out.println(personZhang);
        System.out.println(personLi.getOccupation().hashCode());
        System.out.println(personLi);
    }

}
class Person{
   
    private String name;
    private int age;
    private Occupation occupation;  //职业

    public Person(){
   }

    public Person(String name, int age, Occupation occupation) {
   
        this.name = name;
        this.age = age;
        this.occupation = occupation;
    }
    //拷贝构造器,用于拷贝对象
    public Person(Person person) {
   
        this.name = person.name;
        this.age = person.age;
        this.occupation = person.occupation;
    }
    public String getName() {
   
        return name;
    }

    public void setName(String name) {
   
        this.name = name;
    }

    public int getAge() {
   
        return age;
    }

    public void setAge(int age) {
   
        this.age = age;
    }

    public Occupation getOccupation() {
   
        return occupation;
    }

    public void setOccupation(Occupation occupation) {
   
        this.occupation = occupation;
    }

    @Override
    public String toString() {
   
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", occupation=" + occupation +
                '}';
    }
}
class Occupation{
   
    private String occName;
    private int salary;

    public Occupation() {
   
    }
    public Occupation(String occName, int salary) {
   
        this.occName = occName;
        this.salary = salary
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值