设计模式----原型模式时候,涉及到的复制克隆,

    Cloneable 接口,内部是没有任何方法的,

这个接口其实是一个标记性的接口,和Serializable是一样的,都是标记使用,

在类实现了这个Cloneable 接口后调用Object中得clone方法,才可以正常的使用,如果没有implements Cloneable的类调用Object.clone()方法就会抛出CloneNotSupportedException。

在复制中,分为浅复制和深复制;

先说浅复制:

其实这样的复制是一种很危险的复制,有时候预期效果并不是你想要的!

 package Method.clone;

 public class Student implements Cloneable
{
private int id;
private String name;
public StringBuffer sb = new StringBuffer(""); public Student() {
this.id = 744;
this.name = "FL";
} public Student(int id, String name) {
this.id = id;
this.name = name;
} public boolean equals(Object obj) {
return this.id == ((Student) obj).id;
} public String toString() {
return "Student id : " + id + " Name " + name;
} public static void main(String[] args) throws CloneNotSupportedException // 这里为什么一定得写
{
Student s1 = new Student(101, "WangQiang");
Student s2 = (Student) s1.clone();
System.out.println(s1 == s2);
System.out.println(s1);
System.out.println(s2); s1.sb.append("s1's string");
System.out.println("s2.sb's value = " + s2.sb.toString());
System.out.println(s1.sb==s2.sb); }
}

浅层拷贝导致s1和s2共享同一个StringBuffer对象,s2还是可以调用s1中得StringBuffer。这样的复制还是很危险!

Object中提供的clone方法是一种浅复制,对于基本类型的字段,可以说它成功克隆了。但对于对象型字段,它并没有实现克隆的功能,仅仅做了一个赋值。(拷贝基本成员属性,对于引用类型仅返回指向改地址的引用)

深复制:

      首先这个对象必须实现了Serializable 接口,可以被序列化,和反序列化:深复制时候采用的是流进行读写的,原对象还是存在JVM中

序列化前和序列化后的对象的关系

反序列化还原后的对象地址与原来的的地址不同,序列化前后对象的地址不同了,但是内容是一样的,而且对象中包含的引用也相同。换句话说,通过序列化操作,我们可以实现对任何可Serializable对象的”深度复制(deep copy)"——这意味着我们复制的是整个对象网,而不仅仅是基本对象及其引用。对于同一流的对象,他们的地址是相同,说明他们是同一个对象,但是与其他流的对象地址却不相同。也就说,只要将对象序列化到单一流中,就可以恢复出与我们写出时一样的对象网,而且只要在同一流中,对象都是同一个。

 public  Object deepClone() throws IOException, ClassNotFoundException{
//将对象写到流里
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
//从流里读回来
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}

对具体分析:参考博客

 http://www.cnblogs.com/tonyluis/p/5779187.html

Cloneable 和clone的区别和联系的更多相关文章

  1. GIT(6)----fork和clone的区别,fetch与pull的区别

    参考资料: [1].Git学习笔记:fork和clone的区别,fetch与pull的区别 [2].在Github和Git上fork之简单指南

  2. fork()、vfork()、clone()的区别

    因为生活的复杂,这是一个并行的世界,在同一时刻,会发生很多奇妙的事情,北方下雪,南方下雨,这里在吃饭,那边在睡觉,有人在学习,有人在运动,所以这时一个多彩多姿的世界,每天都发生着很多事情,所以要想很好 ...

  3. Git 中 pull 和 clone 的区别

    git pull git clone clone 是本地没有 repository 时,将远程 repository 整个下载过来. pull 是本地有 repository 时,将远程 reposi ...

  4. jQuery之克隆事件--clone()与clone(true)区别

    clone()与clone(true)同为克隆 clone()表示复制标签本身, clone(true)会将标签绑定的事件一起复制 来看案例: <!DOCTYPE html> <ht ...

  5. copyTo和clone的区别/制作mask的fillpoly函数(有问题)

    OpenCV中mat::copyto( )函数使用方法 OpenCV的fillPoly函数 使用OpenCV库进行图像处理时,经常会用到clone和copyTo函数,这里对两个函数进行介绍. copy ...

  6. 深入理解Java中的Clone与深拷贝和浅拷贝

    1.Java对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象. ...

  7. java Clone之深浅拷贝

    要点: 1.浅度拷贝可以不实现Cloneable接口(自动使用Object.clone)或者不重写Cloneable的clone方法. 2.要被深度拷贝的类必须实现Cloneable接口并重写clon ...

  8. j详细说明ava于clone办法

    原文地址:http://leihuang.org/2014/11/14/java-clone/ In java, it essentially means the ability to create ...

  9. linux 进程创建clone、fork与vfork

    目录: 1.clone.fork与vfork介绍 2.fork说明 3.vfork说明 4.clone说明5.fork,vfork,clone的区别 内容: 1.clone.fork与vfork介绍 ...

随机推荐

  1. 倍福TwinCAT(贝福Beckhoff)基础教程2.2 TwinCAT常见类型使用和转换_枚举

    在Duts的文件夹上右击,可以声明一个枚举类型,按照格式填写所有类型(注意枚举的元素前面都是逗号,最后一个不需要符号)   在正常使用的时候,枚举的单词可以当全局变量来用     更多教学视频和资料下 ...

  2. AFN检測网络情况

    问: I'm a bit lost on AFNetorking's Reachability and haven't found a lot of good information out ther ...

  3. modal html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. php装饰器

    <?php /* * 用一个类来装饰另一个类,动态的给一个对象增加一些额外功能,这些功能一般是在这个对象调用方法前或方法后 * 比如我们要给User类增加一个登陆日志的功能 */ // 抽象构件 ...

  5. Centos——升级Python2.7及安装pip

    CentOS升级Python2.7及安装pip 1) 升级Python2.7 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ...

  6. mybatis like写法

    name like concat(concat('%',#{name}),'%') name like concat('%',#{name},'%')

  7. JS与原生OC/Swift相互调用总结

    代码地址如下:http://www.demodashi.com/demo/12754.html JS-OC-Swift JS和OC/Swift相互调用,主要总结了JS和OC交互的三种方式 1.使用UI ...

  8. Java 常见的异常错误分析大集合

      算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:Negative ...

  9. iOS时间间隔判断

    如何计算两个NSDate之间的时间间隔呢? timeIntervalSinceDate: Returns the interval between the receiver and another g ...

  10. C# 中 finally 的用法

    当一个异常抛出时,它会改变程序的执行流程.因此不能保证一个语句结束后,它后面的语句一定会执行,在 C# 中这个问题可以用 finally 解决. 为了确保一个语句总是能执行(不管是否抛出异常),需要将 ...