zoukankan      html  css  js  c++  java
  • java-深克隆和浅克隆

    文章参考 https://www.cnblogs.com/acode/p/6306887.html

    一、前提

        1、使用clone()方法的类,必须实现Cloneable接口,

              否则调用clone()方法时候,会抛出  CloneNotSupportedException

         2、clone()为protected修饰符方法,所以如果想使用clone()方法,必须在子类中实现

    二、实战

       类关系(

                    Student:两个基础类型属性

                                    一个引用类型属性)

        1、创建一个Student类

    @Data
    public class Student implements Cloneable{

    private String name;

    private int age;

    private Mother mother ;

    @Override
    protected Object clone() throws CloneNotSupportedException {
    Student student = (Student) super.clone();
    try {
    Mother mother1 = (Mother)mother.clone();
    student.setMother(mother1);
    } catch (Exception e) {
    e.printStackTrace();
    }
    return student;
    }
    }

       2、创建一个Mother类

    @Data
    public class Mother implements Cloneable {
    
        private String name;
    
        private int age;
        
        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    }

    3、创建一个测试类

    public class Test {

    public static void main(String[] args) throws Exception {
    //============初始化================
    Mother mother = new Mother();
    mother.setName("小王mama");
    mother.setAge(40);
    Student student = new Student();
    student.setAge(1);
    student.setName("小王");
    student.setMother(mother);
    //============克隆================
    Student student2 = (Student)student.clone();
    student2.setName("小李");
    student2.setAge(2);
    student2.getMother().setAge(45);
    student2.getMother().setName("小李mama");
    //============输出================
    System.out.println(student);
    System.out.println(student2);
    }
    }  

    三、结果

    Student(name=小王, age=1, mother=Mother(name=小王mama, age=40))
    Student(name=小李, age=2, mother=Mother(name=小李mama, age=45))

    四、分析

    1、结果实现类深度克隆

    2、如果在Student类的clone()方法中没有,进行Mother类的操作,则Mother属性只会进行引用操作

          修改Student类中的clone()方法

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

          结果

    Student(name=小王, age=1, mother=Mother(name=小李mama, age=45))
    Student(name=小李, age=2, mother=Mother(name=小李mama, age=45))

    3、歪门邪术(实现序列化接口,实现clone)  对象串行化,但是串行化却很耗时,在一些框架中,我们便可以感受到,它们往往将对象进行串行化后进行传递,耗时较多。

    @Data
    public class Student  implements Serializable{
    
        private static final long serialVersionUID = 1L;
    
    
        private String name;
    
        private int age;
    
    
        private Mother mother ;
    
        public Object deepClone() throws IOException, 
                ClassNotFoundException {
            // 将对象写到流里
            ByteArrayOutputStream bo = new ByteArrayOutputStream();
            ObjectOutputStream oo = new ObjectOutputStream(bo);
            oo.writeObject(this);
            // 从流里读出来
            ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
            ObjectInputStream oi = new ObjectInputStream(bi);
            return (oi.readObject());
        }
    }
    @Data
    public class Mother implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        private String name;
    
        private int age;
        
    }

    结果:深度克隆成功

    Student(name=小王, age=1, mother=Mother(name=小王mama, age=40))
    Student(name=小李, age=2, mother=Mother(name=小李mama, age=45))
  • 相关阅读:
    linux定时任务
    php与xpath使用操作文本节点
    php处理图片实现
    Yii源码阅读笔记
    Yii源码阅读笔记
    Yii源码阅读笔记
    Yii源码阅读笔记
    Yii源码阅读笔记
    Yii源码阅读笔记
    Yii源码阅读笔记
  • 原文地址:https://www.cnblogs.com/shuaiandjun/p/9532536.html
Copyright © 2011-2022 走看看