• java笔记之对象的克隆


    对象的克隆
    对象的浅克隆:
        对象浅克隆要注意的细节:
        1. 如果一个对象需要调用clone的方法克隆,那么该对象所属的类必须要实现Cloneable接口。
        2. Cloneable接口只不过是一个标识接口而已,没有任何方法。
        3. 对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把
         另外一个对象也克隆一份。

        4. 对象的浅克隆也不会调用到构造方法的。

    class Address implements Cloneable{
        String city;
        public Address(String city) {
            this.city=city;
        }
    }
    class people  implements Cloneable{
        Address address;
        String name ;
        int id;
        public people(int id,String name ,Address address) {
            this.id=id;
            this.name=name;
            this.address=address;
        }
        @Override
        public String toString() {
            return "姓名:"+this.name+"  编号:"+this.id+"  地址:"+this.address.city;
        }
        @Override
        public Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    }
    public class Demo02 {
        public static void main(String[] args) throws Exception {
            Address address=new Address("广州");
            people p1=new people(110,"狗娃",address);
            people p2=(people) p1.clone();
            address.city="长沙";
            System.out.println("p1:"+p1);
            System.out.println("p2:"+p2);
        }
    }

    输出结果;

    p1:姓名:狗娃 年龄:110 地址:长沙
    p2:姓名:狗娃 年龄:110 地址:长沙 

    对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把另一个对象克隆过去。

    对象的深克隆: 对象的深克隆就是利用对象的输入输出流把对象先写到文件上,然后再读取对象的信息过程称作深克隆

    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    
    class Address implements Cloneable,Serializable{
        String city;
        public Address(String city) {
            this.city=city;
        }
    }
    class people  implements Cloneable,Serializable{
        Address address;
        String name ;
        int id;
        public people(int id,String name ,Address address) {
            this.id=id;
            this.name=name;
            this.address=address;
        }
        @Override
        public String toString() {
            return "姓名:"+this.name+"  编号:"+this.id+"  地址:"+this.address.city;
        }
        @Override
        public Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    }
    public class Demo02 {
        public static void main(String[] args) throws Exception {
            Address address=new Address("广州");
            people p1=new people(110,"狗娃",address);
            write(p1);
            people p2=read();
            address.city="长沙";
            System.out.println("p1:"+p1);
            System.out.println("p2:"+p2);
        }
        public static people read() throws Exception{
            FileInputStream fileInputStream =new FileInputStream("F:/obj.txt");
            ObjectInputStream obj=new ObjectInputStream(fileInputStream);
            
            return (people) obj.readObject();
            
        }
        public static void write(people p) throws IOException{
            FileOutputStream fileOutputStream =new FileOutputStream("F:/obj.txt");
            ObjectOutputStream object=new ObjectOutputStream(fileOutputStream);
            object.writeObject(p);
            object.close();
        }
    }

    输出结果:

    p1:姓名:狗娃 编号:110 地址:长沙
    p2:姓名:狗娃 编号:110 地址:广州

  • 相关阅读:
    简单的排列问题的总结
    php学习
    入门shader,并实现normal mapping on earth
    github 操作查阅 创建仓库 代码更新
    Debian WSL desktop install on windows 10
    使用python三元运算if else
    搜索引擎语法整理
    个人小程序学习笔记,会持续学习并更新!
    Windows Form父子两个窗体之间的传值测试
    Asp.netCore 3.0 Web 实现Oauth2.0微信授权登陆的测试
  • 原文地址:https://www.cnblogs.com/AllenRandolph/p/7061577.html
Copyright © 2020-2023  润新知