深克隆和浅克隆.doc_第1页
深克隆和浅克隆.doc_第2页
深克隆和浅克隆.doc_第3页
深克隆和浅克隆.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

java中深克隆和浅克隆的用法和区别首先,说道深克隆和浅克隆我们就要了解它的具体含义1.什么是深、浅克隆呢?浅克隆:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制。深克隆:对象,对象内部的引用均复制。克隆的特点:1.克隆后的对象具有克隆前的对象的属性和方法。2.哪个类要克隆就要实现接口。区别:1.浅克隆:只克隆其对象的方法,不克隆属性值。现在我有一个Order对象order1,它包含了一个LineItems对象items,这表示的是有一个订单order1,订单的内容是items。好的,现在有另一个客户想要一份订单,内容跟order1完全一样,那么在系统的逻辑层我们怎么做呢?很简单,order2=order1.clone(). 我们知道clone方法是在内存中生成一个新的对象,而不是只得到原对象的引用。这时候,有人说话了:“哦,明白了我们对order2的成员变量进行修改,是不会影响order1的。” 很可惜,这句话只对了一半。假设order类有一个成员变量name,当然改变不会影响,因为他们在不同的内存区域。但是如果改变 order1.items呢?很遗憾,简单地使用order1.clone,是会影响到order2.items的。原因很简单,就是因为clone方法默认的是浅克隆,即不会克隆对象引用的对象,而只是简单地复制这个引用。所以在上例中,items对象在内存中只有一个,order1和order2都指向它,任何一个对象对它的修改都会影响另一个对象。那相对浅克隆,深克隆自然就是会克隆对象引用的对象了。也就是说,在上例中,改变order1.items并不会影响order2.items了。因为内存中有两个一样的items。注意:如果实现深克隆?一个方法自然是重写clone方法,添加如order.items=(LineItems)items.clone()的语句,也就是人为地添加对引用对象的复制。这个方法的缺点是如果引用对象有很多,或者说引用套引用很多重,那么太麻烦了。业界常用的方法是使用串行化然后反串行化的方法来实现深克隆。由于串行化后,对象写到流中,所有引用的对象都包含进来了,所以反串行化后,对等于生成了一个完全克隆的对象。绝!这个方法的要求是对象(包括被引用对象)必须实现了Serializable接口,否则就要用transient关键字将其排除在复制过程中。 JavaSE中深克隆和浅克隆 如何去理解深克隆和浅克隆呢?首先从一个例子上来区分深克隆和浅克隆:/MyObeject只是一个普通的类,下面的LocalCopy是对其的调用,关键是g(),f()两个/方法的区别class MyObjectimplements Cloneable inti;MyObject(int k) i = k;public Object clone() Object o =null;try o =super.clone();catch (CloneNotSupportedException e) System.out.println(MyObject cant clone);return o;public String toString() return Integer.toString(i);publicclass LocalCopy static MyObject g(MyObject g) g.i+;return g;static MyObject f(MyObject f) f = (MyObject) f.clone();/ Local copyf.i+;return f;publicstaticvoid main(String args) MyObject a =new MyObject(11);System.out.println(前a.i=+a.i);/以不同的方式获得了两个对象b和cMyObject b = g(a);MyObject c = f(a);/对b和c的属性更改其值,看看对原对象a的属性的值有没有影响b.i=100;c.i=200;System.out.println(后a.i=+a.i);System.out.println(b.i=+b.i);System.out.println(c.i=+c.i);/*打印结果:前 a.i=11;后 a.i=100b.i=100c.i=200*/ 从表面上看,似乎会觉得a,b,c三个对象之间似乎没有什么联系,那么为什么同样的b对象和c对象对属性i值的修改后,结果a对象的值却改变的同b对象一样了,为什么不是c对象呢?实际上区别就在于b,c对象的获取方式不同,详细的解释请看下文:【定义的区分】浅克隆:就是只复制一个对象,而对象内部所存在的指向其他对象、数组或者引用则不予复制。深克隆:相对于浅克隆,深克隆就不仅仅是复制一个对象那么简单,同时也会复制对象内部所包含的所有引用。PS:改变浅克隆得到的对象(即引用)会影响对象本身的值和引用,而改变深克隆得到的对象则不会改变原来对象本身的值和引用(因为深克隆是对原对象进行了完全的按位复制,包括原对象的值和引用)。 由上图可以看出浅克隆的对象和原对象共用所有的引用,而深克隆对象则已经与原来的对象没有任何关联性了,所以如果修改掉浅克隆的对象只有通过修改外面所引用的值来实现,这样的话,原来的对象的值也会发生改变,而深克隆对象值的改变则不会影响原来的对象了。【实现方式】关于克隆的一些概念:通常新建一个类,它的基础类的类型是Object,而克隆方法是在所有类最基本的Object中定义的,但克隆仍然不会在每个类里自动进行。那是为什么呢?那是因为在Object中的clone()方法是protected模式的,这样是为了考虑到安全性而做出的设定的,如果设public的话,谁都可以克隆了,那就没有秘密可言了!基础类clone()提供了一个有用的功能它进行的是对衍生类对象的真正“按位”复制,所以相当于标准的克隆行动。但是需要我们自己去覆盖这个clone()方法,并且将其设置为public的才能真正的实现克隆的效果。一点小技巧:在判断对象是否实现了Cloneable,Serializable接口时可以采用instanceof来进行判定。实现深克隆的方式主要有两种:(1)实现Cloneable接口,重写clone()方法;(2)通过一个对象序列化后在撤销对它的序列化,这个过程也可以实现克隆PS:需要说明的是虽然这两个方法都可以实现深克隆,但是这两个方法也是是有区别的,主张还是使用第一种方法比较好,因为第二种方法实现起来的 时间会比第一种方法多很多。下面是对两种实现深克隆方式的例子的讲解:(1)实现Cloneable接口

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论