




免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
java克隆入门和深入我们知道,Java是纯面向对象的程序设计语言。Java里,所有的类的顶级父类都是java.lang.Object类,也就是说,如果一个类没有显示 申明继承关系,它的父类默认就是java.lang.Object。 有一个很简单的方法可以证明这一点,我们写一个Test类,如下:public class Test public void someMethod() super.clone(); 里面调用了super.clone(),编译时并不报错。其实clone()方法为java.lang.Object类提供的一个 protected型方法。对象克隆本文通过介绍java.lang.Object#clone()方法来说明Java语言的对象克隆特性。java.lang.Object#clone()方法由java.lang.Object加以实现,主要对对象本身加以克隆。首先我们看看下面的例子:public class TestClone public static void main(String args) MyClone myClone1 = new MyClone(clone1); MyClone myClone2 = (MyClone)myClone1.clone(); if (myClone2 != null) System.out.println(myClone2.getName(); System.out.println(myClone2 equals myClone1: + myClone2.equals(myClone1); else System.out.println(Clone Not Supported); class MyClone private String name; public MyClone(String name) = name; public String getName() return name; public void setName(String name) = name; public Object clone() try return super.clone(); catch (CloneNotSupportedException e) return null; 编译执行TestClone,打印出:C:clonejavac *.javaC:clonejava TestCloneClone Not SupportedC:clone说明MyClone#clone()方法调用super.clone()时抛出了CloneNotSupportedException异常,不 支持克隆。为什么父类java.lang.Object里提供了clone()方法,却不能调用呢?原来,Java语言虽然提供了这个方法,但考虑到安全问题, 一方面将clone()访问级别设置为protected型,以限制外部类访问;另一方面,强制需要提供clone功能的子类实现java.lang.Cloneable接口,在运行期,JVM会检查调用clone()方法的 类,如果该类未实现java.lang.Cloneable接口,则抛出CloneNotSupportedException异常。java.lang.Cloneable接口是一个空的接口,没有申明任何属性与方法。该接口只是告诉JVM,该接口的实现类需要开放“克隆”功 能。我们再将MyClone类稍作改变,让其实现Cloneable接口:class MyClone implements Cloneable ./其余不做改变编译执行TestClone,打印出:C:clonejavac *.javaC:clonejava TestCloneclone1myClone2 equals myClone1: falseC:clone根据结果,我们可以发现:1,myClone1.clone()克隆了跟myClone1具有相同属性值的对象2,但克隆出的对象myClone2跟myClone1不是同一个对象(具有不同的内存空间)小结:如果要让一个类A提供克隆功能,该类必须实现java.lang.Cloneable接口,并重载 java.lang.Object#clone()方法。public class A extends Cloneable public Object clone() try return super.clone(); catch (CloneNotSupportedException e) /throw (new InternalError(e.getMessage(); return null; 对象的深层次克隆 上例说明了怎么样克隆一个具有简单属性(String,int,boolean等)的对象。但如果一个对象的属性类型是List,Map,或者用户自定义的其他类时,克隆行为是通过怎样的方式进行的?很多时候,我们希望即使修改了克隆后的对象的属性值,也不会影响到原对象,这种克隆我们称之为对象的深层次克隆。怎么样实现对象的深层次克隆呢?验证对象的克隆方式为了验证对象的克隆方式,我们对上面的例子加以改进,如下(为了节省篇幅,我们省略了setter与getter方法):public class TestClone public static void main(String args) /为克隆对象设置值 MyClone myClone1 = new MyClone(clone1); myClone1.setBoolValue(true); myClone1.setIntValue(100); /设置List值 List listValue = new ArrayList(); listValue.add(new Element(ListElement1); listValue.add(new Element(ListElement2); listValue.add(new Element(ListElement3); myClone1.setListValue(listValue); /设置Element值 Element element1 = new Element(element1); myClone1.setElement(element1); /克隆 MyClone myClone2 = (MyClone)myClone1.clone(); if (myClone2 != null) /简单属性 System.out.println(myC= + myClone2.getName() + myClone2.boolValue= + myClone2.isBoolValue() + myCValue= + myClone2.getIntValue() ); /复合属性(List与Element) List clonedList = myClone2.getListValue(); Element element2 = myClone2.getElement(); System.out.println(myClone2.listValue.size(): + clonedList.size(); System.out.println(myClone2.element.equals(myClone1.element): + element2.equals(element1); System.out.println(myC: + element2.getName(); /下面我们测试一下myClone2.element是否等于myClone1.element /以及myClone2.listValue是否等于myClone1.listValue /为此,我们修改myClone2.element与myClone2.listValue,如果myClone1的相应值也跟着被修改了,则它们引用 的是同一个内存空间的变量,我们认为它们相等 clonedList.add(ListElement4); System.out.println(myClone1.listValue.size(): + listValue.size(); element2.setName(Element2); System.out.println(myC: + element1.getName(); else System.out.println(Clone Not Supported); class MyClone implements Cloneable private int intValue; private boolean boolValue; private String name; private List listValue; private Element element; public MyClone(String name) = name; ./setter与getter方法(略)class Element implements Cloneable private String name; public Element (String name) = name; ./setter与getter方法(略)编译执行TestClone,打印出:C:clonejavac *.javaC:clonejava TestClonemyC=clone1 myClone2.boolValue=true myCValue=100myClone2.listValue.size():3myClone2.element.equals(myClone1.element):truemyC:element1myClone1.listValue.size():4myC:Element2myClone2 equals myClone1: falseC:clone我们发现,对于对象里的List,Element等复合属性,super.clone()只是简单地赋值,没有采取克隆手段。也就是说,修改被克 隆后的对象值,会影响到原对象。怎么进行深层次的克隆呢?答案是,我们只能手动在重载的clone()方法里,对属性也分别采用克隆操作。当然条件是,属性类也得支持克隆操作class MyClone implements Cloneable . public Object clone() try MyClone myClone = (MyClone)super.clone(); /分别对属性加以克隆操作 myClone.element = this.element.clone(); myClone.listValue = new ArrayList(); for (Element ele:this.listValue) myClone.listValue.add(ele.clone(); return myClone; catch (CloneNotSupportedException e) return null; ./让Element类也支持克隆操作class Element implements Cloneab
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 开心一刻 跳动的木屐教学设计-2025-2026学年初中音乐沪教版八年级下册-沪教版
- 淘营销平台活动说课稿-2025-2026学年中职专业课-网络营销-电子商务-财经商贸大类
- 6.1我国四大地理区域的划分说课稿2023-2024学年中图版地理七年级下册
- 2025年中考数学试题分类汇编:概率(6大考点55题) (第1期)解析版
- 圆和扇形(教学设计)-2024-2025学年六年级上册数学冀教版
- (2025秋新版)青岛版科学二年级上册全册教学设计
- 第十一课 音乐与戏剧(二)教学设计-2025-2026学年高中音乐人教版必修 艺术欣赏-人教版
- 第四单元第1课《古城古镇考察》说课稿 -2024-2025学年人教版初中美术九年级上册
- 5.3《圆的面积》(教学设计)-2024-2025学年六年级上册数学人教版
- 蒸汽锅炉运行知识培训内容课件
- 《蔚来汽车的SWOT分析》课件
- 2025-2030中国建筑工程质量检测行业市场发展分析及竞争格局与投资前景研究报告
- 产品美工面试题及答案
- 老年慢性病的中药调理方法
- 旧厂房改造施工安全措施
- 食堂服务礼仪培训
- 书法第一课课件-【知识精研】小学生书法版
- 美发培训课件
- 物流行业运输数据报送流程与追踪机制
- 《课程设计模式》课件
- 医疗器械参展总结报告
评论
0/150
提交评论