浅谈对象的克隆

一、对象的浅克隆

对象浅克隆要注意的细节:

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

Person类中,引用了Address类,我们通过浅克隆来观察结果:

class Address implements Cloneable ,Serializable{
    String city;

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

}
public class Person implements Cloneable ,Serializable{
    int id;
    String name;
    Address address;
    public Person(int id, String name, Address address) {
        super();
        this.id = id;
        this.name = name;
        this.address = address;
    }
    public String toString(){
        return "编号:"+ this.id+" 姓名:"+ this.name+" 地址:"+ address.city;
    }
    public Object clone() throws CloneNotSupportedException{
        return super.clone();
    }
}

当我们克隆了p1,然后更改p2的city,p1和p2都改变了,也就是上边所说的第3点:对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把另外一个对象也克隆一份。

二、对象深拷贝

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

深复制把要复制的对象所引用的对象都复制了一遍

public class Demo2 {
    public static void main(String[] args) throws Exception {
        Address address=new Address("上海");
        Person person1=new Person(1,"萧山",address);
        writeObj(person1);
        Person person2=readObj();
        person2.address.city="河南";
        System.out.println(person1);
        System.out.println(person2);
    }
    public static void writeObj(Person p) throws Exception{
        File file=new File("D:\\obj.txt");
        FileOutputStream fileOutputStream=new FileOutputStream(file);
        ObjectOutputStream objectOutputStream=new ObjectOutputStream(fileOutputStream);
        objectOutputStream.writeObject(p);
    }
    public static Person readObj() throws Exception {
        File file=new File("D:\\obj.txt");
        FileInputStream fileInputStream=new FileInputStream(file);
        ObjectInputStream objectInputStream=new ObjectInputStream(fileInputStream);
        return (Person) objectInputStream.readObject();
    }
}

当我们克隆了p1,然后更改p2的city,p1就不会改变了,也就是把Address也复制了一份。

时间: 2024-10-19 17:36:46

浅谈对象的克隆的相关文章

深入javascript 浅谈对象

又一周的结束,下周js就要结束,但自己感觉对js印象很模糊,对对象.属性.方法.事件.调用函数很不熟悉,不知道怎么分类,也不知道什么时候触发事件,总之一句话,分界很模糊,知其然,却不知其所以然,恼火! 首先,建立js,就要面向对象的概念,谈到面向对象,就不可避免的要涉及类的概念.要实现一般用: 1.工厂方式: 这种方式每次调用它的工厂函数,都会创建一个新对象. 2.构造函数方式: 在构造函数中,内部无创建对象,而是使用this关键字. 3.原型方式: 该方式利用了对象的prototype属性,可

浅谈对象的创建、内存布局和访问定位

在此简单的记录一下<深入理解Java虚拟机>第2章的2.3节内容. 对象的创建 这里的对象的创建是指普通的对象(不包括数组和Class对象).对象的创建简单来说就是执行new的时候,虚拟机做出对应的响应.让我们看看一下虚拟机创建对象的过程: 1.虚拟机遇到new指令时,首先尝试在常量池中定位到对应类的符号引用,并检查这个符号引用代表类是否已被加载.解析和初始化过.如果没有,那必须先执行相应的类加载过程(后续会写一下关于类加载的问题). 2.类加载检查通过后,为新生对象分配内存.对象内存的大小在

杉岩:浅谈对象存储和块存储区别

什么是块存储 数据被存储在固定大小的块内.块内只存储数据本身:Address就是块唯一的识别信息:对于块存储,没有metadata. 当应用和数据都在本地的时候,性能会比较好:当应用和数据在地理位置上分离较远的时候,性能会较差. 适用场景: 块存储适合用于事务型数据库,可用于大部分通用业务场景下的数据存储 什么是对象存储 可以理解是一个海量的存储空间,最适合存储互联网上产生 的图片.短视频.音频等海量非结构化数据,您可以通过 API 在任何时间.任何地点访问对象存储里的数据. 每个对象包括3个部

浅谈对象之间的关系

<穿越大半个中国去睡你> 其实,睡你和被你睡是差不多的,无非是 两具肉体碰撞的力,无非是这力催开的花朵 无非是这花朵虚拟出的春天让我们误以为生命被重新打开 大半个中国,什么都在发生:火山在喷,河流在枯 一些不被关心的政治犯和流民 一路在枪口的麋鹿和丹顶鹤 我是穿过枪林弹雨去睡你 我是把无数的黑夜摁进一个黎明去睡你 我是无数个我奔跑成一个我去睡你 当然我也会被一些蝴蝶带入歧途 把一些赞美当成春天 把一个和横店类似的村庄当成故乡 而它们 都是我去睡你必不可少的理由 <梦见雪> 梦见八千

.net中对象序列化技术浅谈

.net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数 据.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.反之,反序列化根据流重新构造对象.此外还可以将对象序列化后保存到本地,再次运行的时候可以从本地文件 中“恢复”对象到序列化之前的状态.在.net中有提供了几种序列化的方式:二进制序列化

C#中,用HashTable,DataTable等复制和克隆浅谈

如有雷同,不胜荣欣,若转载,请注明 在C#中,用HashTable,DataTable等复制和克隆浅谈,下面直接看例子 HashTable ht = null; ht = new HashTable(); foreach(string s in ht) { //... } //上面遍历的时候需要修改HashTable中的键值,一般会报异常,提示您的集合已修改XXX什么的,因为foreach遍历的时候,in 后面的集合不可更改 //这个时候应该我想到了,应该在遍历之前复制一份, HashTable

浅谈Java中的对象和引用

浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是"对象和对象引用",很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做"万物皆对象",这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一段原话: "按照通

C# 复制和克隆认识浅谈

如有雷同,不胜荣欣,若转载,请注明 在C#中,用HashTable,DataTable等复制和克隆浅谈,下面直接看例子 HashTable ht = null; ht = new HashTable(); foreach(string s in ht) { //... } //上面遍历的时候需要修改HashTable中的键值,一般会报异常,提示您的集合已修改XXX什么的,因为foreach遍历的时候,in 后面的集合不可更改 //这个时候应该我想到了,应该在便利之前复制一份, HashTable

浅谈Java中的对象和对象引用

浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做“万物皆对象”,这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一段原话: “按照通俗的说法,每个对象都是某个类(class)的一个实