zoukankan      html  css  js  c++  java
  • 深拷贝 & 浅拷贝

    浅拷贝:

    class Professor {
        String name;
        int age;
    
        public Professor(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    }
    
    class Student implements Cloneable {
        String name;
        int age;
        Professor p;
    
        public Student(String name, int age, Professor p) {
            this.name = name;
            this.age = age;
            this.p = p;
        }
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            Student s = (Student) super.clone();
    //        s.p = (Professor) p.clone();
            return s;
        }
    }
    
    public class Main {
        public static void main(String[] args) throws CloneNotSupportedException {
            Professor p = new Professor("教授1", 50);
            Student s1 = new Student("学生1", 18, p);
            Student s2 = (Student) s1.clone();
    
            s2.p.name = "教授2";
            s2.p.age = 30;
            s2.name = "学生2";
            s2.age = 25;
            System.out.println(s1.name + " " + s1.age + " " + s1.p.name + " " + s1.p.age);
        }
    }

    结果: 学生1 18 教授2 30

    深拷贝:

    class Professor implements Cloneable {
        String name;
        int age;
    
        public Professor(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    }
    
    class Student implements Cloneable {
        String name;
        int age;
        Professor p;
    
        public Student(String name, int age, Professor p) {
            this.name = name;
            this.age = age;
            this.p = p;
        }
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            Student s = (Student) super.clone();
            s.p = (Professor) p.clone();
            return s;
        }
    }
    
    public class Main {
        public static void main(String[] args) throws CloneNotSupportedException {
            Professor p = new Professor("教授1", 50);
            Student s1 = new Student("学生1", 18, p);
            Student s2 = (Student) s1.clone();
    
            s2.p.name = "教授2";
            s2.p.age = 30;
            s2.name = "学生2";
            s2.age = 25;
            System.out.println(s1.name + " " + s1.age + " " + s1.p.name + " " + s1.p.age);
        }
    }

    结果: 学生1 18 教授1 50

    序列化形式深拷贝:

    class Professor implements Serializable {
        private static final long serialVersionUID = 1286716519490813020L;
        String name;
        int age;
    
        public Professor(String name, int age) {
            this.name = name;
            this.age = age;
        }
    }
    
    class Student implements Serializable {
        private static final long serialVersionUID = -547004870369127943L;
        String name;
        int age;
        Professor p;
    
        public Student(String name, int age, Professor p) {
            this.name = name;
            this.age = age;
            this.p = p;
        }
    
        public Object deepClone() throws IOException, ClassNotFoundException {
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
            objectOutputStream.writeObject(this);
    
            ObjectInputStream objectInputStream = new ObjectInputStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));
            return objectInputStream.readObject();
        }
    }
    
    public class Main {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            Professor p = new Professor("教授1", 50);
            Student s1 = new Student("学生1", 18, p);
            Student s2 = (Student) s1.deepClone();
    
            s2.p.name = "教授2";
            s2.p.age = 30;
            s2.name = "学生2";
            s2.age = 25;
            System.out.println(s1.name + " " + s1.age + " " + s1.p.name + " " + s1.p.age);
        }
    }

    结果: 学生1 18 教授1 50

  • 相关阅读:
    ios正在使用NSDateComponents、NSDate、NSCalendar它的结论是在当前时间是在一段时间在一天。
    linux 核心学习书籍
    Hbase在的应用经验的统计
    09-使用for循环输出空心菱形(循环)
    [置顶] Android下实现自动关机的方法总结
    S3C3440看门狗驱动程序
    MySQL里求给定的时间是所在月份的第几个礼拜
    CheckBox in ListView
    根据复选框后面的描述文字进行选择的技巧
    C#中一些易混知识的比较
  • 原文地址:https://www.cnblogs.com/balfish/p/6306073.html
Copyright © 2011-2022 走看看