• Java对象克隆


    对象克隆

    对象克隆

    在内存中新创建(生成一个对象),并且对象中成员变量的属性也完全相同,在内存中存在两个对象。

    作用

    想在原有对象的基础上产生新的数据,并且还想将原有的数据进行保存。

    分类
    浅克隆

    在克隆时对成员变量进行简单的赋值操作,两个对象的成员变量进行一一赋值,如果成员变量为基本数据类型,那将不会产生影响(基本数据类型的赋值会创建新的地址)而引用数据类型则不会,只是简单地将对象的地址值进行赋值,这样两个引用指向同一个地址,当一个引用类型的成员变量改变后就会影响另一个对象的成员变量也发生改变,并不能将原有的数据进行保存。

    深克隆
    • 在对象浅克隆的基础上对基本数据类型的成员变量再次进行浅克隆。
    public class Person implements Cloneable {
        String name;
        int age;
        Person girlFriend;
    
        public Person(int age, String name) {
            this.age = age;
            this.name = name;
        }
    
        public void setFri(Person person) {
            this.girlFriend = person;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", girlFriend=" + girlFriend +
                    '}';
        }
    
        @Override
        public Person clone() {
            Person p = null;
            try {
                p = (Person) super.clone();
                if (p.girlFriend != null) {
                    p.girlFriend = p.girlFriend.clone();// girlFriend为引用类型的成员变量,需要再次进行浅克隆,注意:克隆的引用类型成员变量也需要实现Cloneable接口
                }
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            return p;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 通过序列化及反序列化实现对象深克隆
    import java.io.*;
    
    public class Person implements Serializable {
        String name;
        int age;
        Person girlFriend;
    
        public Person(int age, String name) {
            this.age = age;
            this.name = name;
        }
    
        public void setGirlFriend(Person person) {
            this.girlFriend = person;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", girlFriend=" + girlFriend +
                    '}';
        }
    
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            Person oldPerson = new Person(18, "zhangsan");
            oldPerson.setGirlFriend(new Person(21, "honghong"));
            Person newPerson = null;
            ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("E:\\test.txt"));
            output.writeObject(oldPerson);
            ObjectInputStream input = new ObjectInputStream(new FileInputStream("E:\\test.txt"));
            newPerson = (Person) input.readObject();
            newPerson.girlFriend.age = 25;
            newPerson.girlFriend.name = "lili";
            System.out.println(oldPerson);
            System.out.println(newPerson);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
  • 相关阅读:
    Centos-7静默安装Oracle-11gr2
    Springboot 实践(21)服务熔断机制
    Java泛型的总结
    如何利用腾讯云轻量应用服务器五分钟搭建一个WordPress博客?
    MeterSphere 至学篇
    Vue中有哪些优化性能的方法?
    Linux —— 进程控制
    软件设计师2015上午题基础知识(易错整理)
    【vue3】10-vue组件化额外知识补充(下)-动态组件-组件缓存-v-model在组件上的应用
    c语言中磁盘文件的分类
  • 原文地址:https://blog.csdn.net/qq_52391639/article/details/133096718