1.深拷贝与浅拷贝

浅拷贝是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。

2.深拷贝和浅拷贝的实现

浅拷贝的实现很简单,直接继承Object类的clone方法就是浅拷贝

现在说一下深拷贝,深拷贝一般的做法是把类实现Serializable接口,使得这个类具有序列化特性

然后提供深拷贝的方法,先把整个对象序列化到流里,然后再从流里反序列化出来

代码如下

 1 package test;
2
3 import java.io.*;
4
5 public class DeepCopyTest {
6
7 public static void main(String[] args) throws Exception,
8 IOException, ClassNotFoundException {
9 long t1 = System.currentTimeMillis();
10 Professor2 p = new Professor2("wangwu", 50);
11 Student2 s1 = new Student2("zhangsan", 18, p);
12 Student2 s2 = (Student2) s1.deepClone();
13 s2.p.name = "lisi";
14 s2.p.age = 30;
15 System.out.println("name=" + s1.p.name + "," + "age=" + s1.p.age); // 学生1的教授不改变。
16 long t2 = System.currentTimeMillis();
17 System.out.println(t2-t1);
18 }
19
20 }
21
22 class Professor2 implements Serializable {
23 private static final long serialVersionUID = 1L;
24 String name;
25 int age;
26
27 Professor2(String name, int age) {
28 this.name = name;
29 this.age = age;
30 }
31 }
32
33 class Student2 implements Serializable {
34 private static final long serialVersionUID = 1L;
35 String name;// 常量对象。
36 int age;
37 Professor2 p;// 学生1和学生2的引用值都是一样的。
38
39 Student2(String name, int age, Professor2 p) {
40 this.name = name;
41 this.age = age;
42 this.p = p;
43 }
44
45 public Object deepClone() throws Exception {
46 // 将对象写到流里
47 ByteArrayOutputStream bo = new ByteArrayOutputStream();
48 ObjectOutputStream oo = new ObjectOutputStream(bo);
49 oo.writeObject(this);
50 // 从流里读出来
51 ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
52 ObjectInputStream oi = new ObjectInputStream(bi);
53 return (oi.readObject());
54 }
55
56 }
 

对象的克隆(clone方法)的更多相关文章

  1. Java 深度克隆 clone()方法重写 equals()方法的重写

    1.为什么要重写clone()方法? 答案:Java中的浅度复制是不会把要复制的那个对象的引用对象重新开辟一个新的引用空间,当我们需要深度复制的时候,这个时候我们就要重写clone()方法. 2.为什 ...

  2. java Object对象的clone方法

    参考copy链接:http://blog.csdn.net/bigconvience/article/details/25025561 在看原型模式,发现要用到clone这个方法,以前和朋友聊过,没怎 ...

  3. 详解Java中的clone方法:原型模式

    转:http://developer.51cto.com/art/201506/478985.htm clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的 ...

  4. [Effective Java]第三章 对所有对象都通用的方法

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  5. Java中的克隆(CLONE)

    解读克隆 编程过程中我们常常遇到如下情况: 假设有一个对象object,在某处又需要一个跟object一样的实例object2,强调的是object和object2是两个独立的实例,只是在 开始的时候 ...

  6. Effective Java 第三版——13. 谨慎地重写 clone 方法

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  7. 如何巧妙的使用ArrayList的Clone方法

    一.ArrayList的Clone方法的源码 返回一个Object对象,所以在使用此方法的时候要强制转换. ArrayList的本质是维护了一个Object的数组,所以克隆也是通过数组的复制实现的,属 ...

  8. Java 的 clone 方法 && 浅复制和深复制

    1 Java中对象的创建过程 java创建对象的方式有以下两种: (1)使用new操作符创建一个对象 (2)使用clone的方法复制一个对象,(在Java中,clone是Object类的protect ...

  9. java基础知识总结--对象的克隆

    前提:在Java语言中所有的类的都是缺省的继承Java语言中的Object类的, protected native Object clone() throws CloneNotSupportedExc ...

  10. 详解Java中的clone方法 -- 原型模式

    转自: http://blog.csdn.net/zhangjg_blog/article/details/18369201 Java中对象的创建   clone顾名思义就是复制, 在Java语言中, ...

随机推荐

  1. Python之【模块】

    双层装饰器 一个函数可以被多个装饰器装饰: 多层装饰器的本质是:嵌套: 执行规则是:解释自下而上,执行自上而下 •简单的用户权限验证程序: USE_INFO = {} # 初始化一个字典,用户存放用户 ...

  2. flask基本使用

    一.flask安装以及启动 1.安装 pip install flask 2.开启第一个flask项目 新建文件HelloWord.py from flask import Flask app = F ...

  3. 从Paxos到Zookeeper 分布式一致性原理与实践读书心得

    一 本书作者介绍 此书名为从Paxos到ZooKeeper分布式一致性原理与实践,作者倪超,阿里巴巴集团高级研发工程师,国家认证系统分析师,毕业于杭州电子科技大学计算机系.2010年加入阿里巴巴中间件 ...

  4. Python怎么控制将一个整数输出成指定长的十六进制数?

    使用format方法,在格式控制中进行控制,具体控制参数为: {:#016X} 其中: 大括号表示该处从后面的format的参数中取值 冒号表示格式控制开始 0表示长度不足16位补0 16表示长度 X ...

  5. 老猿学5G扫盲贴:3GPP规范文档命名规则及同系列文档阅读指南

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在学习5G规范过程中,有些内容把握不定的时候,有时 ...

  6. VirtualBox安装Centos出现E_FAIL (0x80004005)的解决方法

    问题描述:UUID已经存在 Cannot register the hard disk 'F:\hadoop\VirtualBox-centos\centos6.4\centos6.4.vdi' {0 ...

  7. LZZ磁力资源搜索4.2.2,整合多个站点,大部分资源都能搜到

    资源搜索 4.2.2.20200310网友提出的功能已完成1:新增 时间日期排序,单击表头或右键菜单选择,即可自动排序2:新增 搜索完毕 音效开启或关闭 选项3:资源站点 Sunyaa 由聚合站点改为 ...

  8. Java对象操作工具

    对象复制(反射法) public static void copyProp(Object from, Object to, String... filterProp) { HashSet<Str ...

  9. NetCDF格式.nc

    netcdf sfc_pres_temp { dimensions: latitude = 6 ; //纬度轴 longitude = 12 ; //经度轴 variables: float lati ...

  10. webpack与vue使用

    项目基本结构目录: index.html <!DOCTYPE html> <html lang="en"> <head> <meta ch ...