Cloneable 和clone的区别和联系

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

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

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

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

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

先说浅复制:

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

 1 package Method.clone;
 2
 3 public class Student implements Cloneable
 4 {
 5     private int id;
 6     private String name;
 7     public StringBuffer sb = new StringBuffer("");
 8
 9     public Student() {
10         this.id = 744;
11         this.name = "FL";
12     }
13
14     public Student(int id, String name) {
15         this.id = id;
16         this.name = name;
17     }
18
19     public boolean equals(Object obj) {
20         return this.id == ((Student) obj).id;
21     }
22
23     public String toString() {
24         return "Student id : " + id + " Name " + name;
25     }
26
27     public static void main(String[] args) throws CloneNotSupportedException // 这里为什么一定得写
28     {
29         Student s1 = new Student(101, "WangQiang");
30         Student s2 = (Student) s1.clone();
31         System.out.println(s1 == s2);
32         System.out.println(s1);
33         System.out.println(s2);
34
35         s1.sb.append("s1‘s string");
36         System.out.println("s2.sb‘s value = " + s2.sb.toString());
37         System.out.println(s1.sb==s2.sb);
38
39     }
40 }

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

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

深复制:

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

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

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

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

对具体分析:参考博客

 http://www.cnblogs.com/tonyluis/p/5779187.html
				
时间: 2024-10-21 09:09:31

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

GIT:fork和clone的区别,fetch与pull的区别

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

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

因为生活的复杂,这是一个并行的世界,在同一时刻,会发生很多奇妙的事情,北方下雪,南方下雨,这里在吃饭,那边在睡觉,有人在学习,有人在运动,所以这时一个多彩多姿的世界,每天都发生着很多事情,所以要想很好的表现这个世界,协调完成一件事儿,就得用到多进程或者多线程.所以进程是程序猿一定会接触到的一个东西,他能使我们的程序效率提高,高效的完成多任务,并行执行.下面主要看看产生进程或线程的三个函数. fork,vfork,clone都是linux的系统调用,这三个函数分别调用了sys_fork.sys_v

copyTo和clone的区别

OpenCV中mat::copyto( )函数使用方法 使用OpenCV库进行图像处理时,经常会用到clone和copyTo函数,这里对两个函数进行介绍. copyTo函数 实现和clone一样的功能,但一般多用于掩模贴图: 1 Mat src = imread(imagepath); 2 Mat src_temp; 3 src.copyTo(src_temp); 另外用途最广的是它的贴图功能: 1 src.copyTo(src_temp, mask); 其中mask为一个二值的掩模图像,如果如

clone方法是如何工作的

clone()是java.lang.Object类下面的一个很难处理的方法,clone()的作用很简单,提供一种克隆机制创建对象的副本,对于如何实现它已成为一个棘手的事,同时还长期被广受批评.不管怎样,我们不去争论历史,现在我们将尝试学习clone方法是怎样工作的.说实在的,想理解克隆机制并不简单,甚至有经验的java程序员也很难解释可变对象的克隆是如何运作的.深克隆(deep copy)与浅克隆(shallow copy)的区别.这文章分为三部分,我们首先看clone方法是如何工作的,第二部分

Java中HashSet,HashMap和HashTable的区别(转)

HashMap.HashSet.HashTable之间的区别是Java程序员的一个常见面试题目,在此仅以此博客记录,并深入源代码进行分析: 在分析之前,先将其区别列于下面 1:HashSet底层采用的是HashMap进行实现的,但是没有key-value,只有HashMap的key set的视图,HashSet不容许重复的对象 2:Hashtable是基于Dictionary类的,而HashMap是基于Map接口的一个实现 3:Hashtable里默认的方法是同步的,而HashMap则是非同步的

j详细说明ava于clone办法

原文地址:http://leihuang.org/2014/11/14/java-clone/ In java, it essentially means the ability to create an object with similar state as the original object. 什么是clone 字典中的意思就是复制(强调跟原来的一模一样). *By default, java cloning is 'field by field copy' *.由于Object类不知

详解java中clone方法

原文地址:http://leihuang.net/2014/11/14/java-clone/ In java, it essentially means the ability to create an object with similar state as the original object. 什么是clone 字典中的意思就是复制(强调跟原来的一模一样). *By default, java cloning is 'field by field copy' *.因为Object类不知

系统调用fork()、vfork()以及clone()

一.宏观实现 以前介绍过fork()和clone()的区别,下面介绍一下两者在程序接口上的不同: pid_t fork(void); int __clone(int(*fn)(void *arg), void * child_stack, int flags, void *args) 系统调用__clone()的主要用途是创建一个线程,这个线程可以是内核线程,也可以是用户线程.创建用户空间线程时,可以给定子线程用户空间堆栈的位置,还可以指定子进程运行的起点.同时,也可以用__clone()创建进

linux 进程创建clone、fork与vfork

目录: 1.clone.fork与vfork介绍 2.fork说明 3.vfork说明 4.clone说明5.fork,vfork,clone的区别 内容: 1.clone.fork与vfork介绍 Linux下的进程与线程相同点是都有进程控制块(PCB,具体的类是task_struct).区别在于一个有独立的进程资源,一个是共享的进程资源.除了内核线程是完全没有用户空间.进程资源包括进程的PCB.线程的系统堆栈.进程的用户空间.进程打开的设备(文件描述符集)等. Linux的用户进程不能直接被