Java对象拷贝

# Java对象拷贝

  • 分类
    • 浅拷贝:仅仅克隆基本类型变量,而不克隆引用类型的变量
    • 深拷贝:既克隆基本类型变量,也克隆引用类型变量

# 浅拷贝

通过Object的clone方法实现浅拷贝,通过实现cloneable接口实现拷贝。

public class Address {
    public String city;

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

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    @Override
    public String toString() {
        return "Address{" +
                "city='" + city + '\'' +
                '}';
    }
}
public class Student implements Cloneable {
    private String name;
    private int age;
    private Address address;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Student(String name, int age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    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 Address getAddress() {
        return address;
    }

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

    @Override
    public Object clone() {
        Student student = null;
        try {
            student = (Student) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return student;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address=" + address +
                '}';
    }
}

# 验证

# 验证代码

public class Test{
	public void testClone2() {
        Student student01 = new Student();
        Address address = new Address("上海");
        student01.setName("xiaoming");
        student01.setAge(20);
        student01.setAddress(address);

        Student student02 = (Student) student01.clone();

        //验证是否创建了一个对象
        System.out.println(student01 == student02);
        System.out.println(student01);
        System.out.println(student02);

        //验证是否为拷贝类型,深拷贝或者浅拷贝
        student02.setAge(22);
        student02.setName("xiaowang");
        address.setCity("南京");
        student01.setAddress(address);
        System.out.println(student01);
        System.out.println(student02);
    }
}

# 验证结果

false
Student{name='xiaoming', age=20, address=Address{city='上海'}}
Student{name='xiaoming', age=20, address=Address{city='上海'}}
Student{name='xiaoming', age=20, address=Address{city='南京'}}
Student{name='xiaowang', age=22, address=Address{city='南京'}}

# 深拷贝

public class Address implements Cloneable {
    public String city;

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

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    @Override
    public Object clone() {
        Address address = null;
        try {
            address = (Address) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return address;
    }

    @Override
    public String toString() {
        return "Address{" +
                "city='" + city + '\'' +
                '}';
    }
}
public class Student implements Cloneable {
    private String name;
    private int age;
    private Address address;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Student(String name, int age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    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 Address getAddress() {
        return address;
    }

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

    @Override
    public Object clone() {
        Student student = null;
        try {
            student = (Student) super.clone();
            student.address = (Address) address.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return student;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address=" + address +
                '}';
    }
}

# 验证代码

public class Test{
	public void testClone2() {
        Student student01 = new Student();
        Address address = new Address("上海");
        student01.setName("xiaoming");
        student01.setAge(20);
        student01.setAddress(address);

        Student student02 = (Student) student01.clone();

        //验证是否创建了一个对象
        System.out.println(student01 == student02);
        System.out.println(student01);
        System.out.println(student02);

        //验证是否为拷贝类型,深拷贝或者浅拷贝
        student02.setAge(22);
        student02.setName("xiaowang");
        address.setCity("南京");
        student01.setAddress(address);
        System.out.println(student01);
        System.out.println(student02);
    }
}
false
Student{name='xiaoming', age=20, address=Address{city='上海'}}
Student{name='xiaoming', age=20, address=Address{city='上海'}}
Student{name='xiaoming', age=20, address=Address{city='南京'}}
Student{name='xiaowang', age=22, address=Address{city='上海'}}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java对象拷贝

    java赋值是复制对象引用,如果我们想要得到一个对象的副本,使用赋值操作是无法达到目的的:

    pollyduan
  • java对象拷贝最完全解说 转

    java赋值是复制对象引用,如果我们想要得到一个对象的副本,使用赋值操作是无法达到目的的:

    stys35
  • 什么是 Java 对象深拷贝?面试必问!

    浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化。

    Java技术栈
  • 通过与C++程序对比,彻底搞清楚JAVA的对象拷贝

    JAVA编程中的对象一般都是通过new进行创建的,新创建的对象通常是初始化的状态,但当这个对象某些属性产生变更,且要求用一个对象副本来保存当前对象的“状态”,这...

    智慧zhuhuix
  • Java基础篇:对象拷贝:clone方法 以及 序列化

    我们知道在Java中存在这个接口Cloneable,实现该接口的类都会具备被拷贝的能力,同时拷贝是在内存中进行,在性能方面比我们直接通过new生成对象来的快,特...

    全栈程序员站长
  • 我要拷贝你—Java对象

    java中,如果我要拷贝(复制)一个对象该怎么做呢?今天就和大家一起看看Java中的拷贝。

    码上积木
  • 对象拷贝(五)

    想对一个对象进行处理,又想保留原有的数据进行接下来的操作,就需要克隆了,Java语言中克隆针对的是类的实例。

    用户6182664
  • 拷贝HttpRequestBase对象

    在实践性能测试框架第二版的过程中,我实现了一个单个HttpRequestBase对象的concurrent对象创建,单之前都是用使用唯一的HttpRequest...

    FunTester
  • Java学习之深拷贝浅拷贝及对象拷贝的两种方式

    I. Java之Clone 0. 背景 对象拷贝,是一个非常基础的内容了,为什么会单独的把这个领出来讲解,主要是先前遇到了一个非常有意思的场景 有一个任务,需要...

    一灰灰blog
  • Javascript的对象拷贝[每日前端夜话0x53]

    翻译:疯狂的技术宅 原文:https://smalldata.tech/blog/2018/11/01/copying-objects-in-javascrip...

    疯狂的技术宅
  • JavaScript数组(对象)的深拷贝和浅拷贝

    在JavaSCript中的数据类型中,分为两种:原始类型(number/string/boolean/null/undefined)和引用类型(array/ob...

    celineWong7
  • jQuery (事件、拷贝)对象

    jQuery 对DOM中的事件对象 event 进行了封装,兼容性更好,获取更方便,使用变化不大。事件被触发,就会有事件对象的产生。

    清出于兰
  • 浅谈JS中对象的深拷贝和浅拷贝

    小胖
  • Python - 对象赋值、浅拷贝、深拷贝的区别

    可以看到内存地址是不同的,所以给 old_list 新增一个元素并不会同步让 new_list 也新增

    小菠萝测试笔记
  • 【python】 深拷贝和浅拷贝:copy模块、可变对象和不可变对象、其他拷贝方式

    Python赋值操作或函数参数传递传递的永远是对象引用(即内存地址),而不是对象内容。在Python中一切皆对象,对象又分为可变(mutable)和不可变(im...

    会呼吸的Coder
  • 引用类型、对象拷贝

    小胖
  • ES6之Spread Operater拷贝对象

    Fundebug
  • JavaScript 中对象的深拷贝

    在JavaScript中,对对象进行拷贝的场景比较常见。但是简单的复制语句只能对对象进行浅拷贝,即复制的是一份引用,而不是它所引用的对象。而更多的时候,我们希望...

    哲洛不闹
  • js 数组对象深拷贝

    formData本来是父组件传过来的,但是我不想直接用,于是我直接赋值给一个formDataCopy的对象。

    Daotin

扫码关注云+社区

领取腾讯云代金券