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. linux下gdb命令大全

    感谢国内的ACM同行们的支持,今年应该会是难忘的一年,谢谢大家的帮助啦 gdb命令如下,记全!!!

  2. PyQt(Python+Qt)学习随笔:Qt Designer中部件的locale属性

    locale属性用于设置语言环境,包括语言和国家.如果一个部件没有设置语言环境,则使用父对象的语言环境或者默认语言环境(如果这个部件是顶层部件). 可以使用locale()获取部件的语言环境,也可以通 ...

  3. 【系统设计】WMS系统中 库存、盘点、移库、拆库功能的设计(库内管理)

    最近负责WMS系统 盘点 移库 两个功能模块的功能及数据库设计. 物流仓储系统的搭建,要基于仓库的实际情况,整理内部员工需求,再参考其他WMS系统,经过长时间的讨论和研究,最终转化为产品需求. 这里先 ...

  4. Mysql为什么使用b+树,而不是b树、AVL树或红黑树?

    首先,我们应该考虑一个问题,数据库在磁盘中是怎样存储的?(答案写在下一篇文章中) b树.b+树.AVL树.红黑树的区别很大.虽然都可以提高搜索性能,但是作用方式不同. 通常文件和数据库都存储在磁盘,如 ...

  5. uniapp中使用picker中的注意事项

    APP端中picker点击后不弹出: 1.请确保picker标签里面嵌套了一个view,并且view里面有值 2.请确保picker中的默认值的格式跟该picker类型的值对应 例如下面: <v ...

  6. 00-JAVA语法基础

    1. 原码为数的二进制数,反码是将其二进制数每一位按位取反.补码则不同,正数的补码是其原码本身,负数的补码是其除符号位以外其他每一位按位取反再加一,符号位不变. int a=100; a=a>& ...

  7. vue 循环结构 v-for

    循环结构 v-for 循环数组 用于循环取得数据,类似于js中for-in循环 ,其中in左侧为值,其名称可以自定义,in后为想要取出数据的变量名 运行可以得到结果 in左侧不仅仅只可以放一个值,不仅 ...

  8. Spring MVC例子

    学习Spring MVC的一个例子,参考书籍<Servlet.JSP.Spring MVC学习指南>,简单总结一下. 代码下载:https://github.com/PeiranZhang ...

  9. mysql-zerofill关键字

    zerofill位数填充 mysql> create table shop( -> article int(4) unsigned zerofill default '0000' not ...

  10. 网站开发学习Python实现-Django项目部署-同步之前写的博客(6.2.2)

    @ 目录 1.说明 2.思路 3.代码 关于作者 1.说明 之前写的博客都在csdn和博客园中 要将博客同步到自己的博客网站中 因为都是使用markdown格式书写的,所以直接爬取上传就完事 2.思路 ...