- 浏览: 272993 次
- 性别:
- 来自: 东方水城
文章分类
最新评论
-
18335864773:
pageoffice 插件 可以实现 office文档的在线操 ...
Java调用com组件操作word -
coosummer:
推荐使用在线免费bug管理系统- bug 禅思:http:// ...
Bug管理工具 -
program_coco:
柠檬bug管理系统,一个在线的bug管理系统。www.lemo ...
Bug管理工具 -
影非弦:
这个in.read(data);//data是一个byte[] ...
Java串口通信总结 -
影非弦:
这个不详细啊,我弄了一天了,都没弄出来,总是出错,读信息的时候 ...
Java串口通信总结
经常听到有人说java中没有指针。事实如此吗?no,java是有指针的,只不过换了个名字而已,也就是我们经常提到的引用。我们知道,在java中一
切都是对象,那么我们如何操控对象?如何在成千上万的对象中找到我们所需的那个对象呢?又是如何让对象按照我们的意思来完成任务的呢?
Object o = new Object();
这是java中最常见的语句了,在这句话中做了三件事。首先声明一个Object类型的变量o,在内存中为对象划分一块地址new
Object(),将声明的变量指向内存中的对象。如此一来,我们就可以通过o来操纵对象了。就好像孩子们玩的遥控飞机,在空中飞行的是飞机,而使它做出
优美动作的却是孩子们手中的摇控器。
"克隆"是如今听到的较多的词汇,听说已经将某只羊克隆了好几份了。但愿这种技术不要在人身上实验。java中也有"克隆",与现实世界的克隆一样,将一个实际存在的对象拷贝几份。如下:
//倒霉的羊 public class Sheep implements Cloneable{ private String name; public void setName(String arg) { name = arg; } public String getName() { return name; } public Object clone() throws CloneNotSupportedException { return super.clone(); } } //克隆 public class Main { public static void main(String[] args) throws CloneNotSupportedException { Sheep sheep = new Sheep(); //先得到那只羊的实例 sheep.setName("我是真的"); //给它做个记号 System.out.println("sheep.getName() = " + sheep.getName()); Sheep sheepClone = (Sheep)sheep.clone(); //开始克隆 System.out.println("sheepClone.getName() = " + sheepClone.getName()); } }
运行程序结果为:
sheep.getName() = 我是真的
sheepClone.getName() = 我是真的
两只羊是一模一样的(哪怕那只羊瘸腿)。让我们来看看代码。首先要注意的是Sheep类实现了Cloneable接口(该接口属于java.lang
包,默认已经导入了),该接口中并没有定义要实现的方法,是个空接口,起标志作用。也就是说,实现了这个接口的羊就不再是只普通的羊,它是一只可以被克隆
的羊。再往下看,有个clone方法,返回Object类型的对象,并抛出CloneNotSupportedException异常。该方法覆写了父类
(Object)的clone方法,并在最后调用了super.clone(),这也意味着无论clone类继承结构是什么样的,super.clone
()都会直接或间接调用Object类的clone()方法。看看jdk帮助文档会发现,Object类的clone()是一个native方法,我们知
道,native方法的效率一般来说都是远高于java中的非native方法。这也说明了new一个对象,然后将原对象中的数据导入到新创建的对象中去
的做法是多么愚蠢。必须说明的是Object中的clone方法是protected的,所以要使用clone就必须继承Object类(默认)。并且为
了可以使其它类调用该方法,必须将其作用域设置为public。
以上只是一个简单clone的实现。明天说说"影子clone"和"深度clone"。
夜,深了。何为影子clone?先看一下例子。
//倒霉的羊 public class Sheep implements Cloneable{ private String name; public void setName(String arg) { name = arg; } public String getName() { return name; } public Object clone() throws CloneNotSupportedException { return super.clone(); } } //羊圈 public class Sheepfold implements Cloneable { public Sheep sheep; public String name; public Sheepfold() { sheep = new Sheep(); } public Object clone() throws CloneNotSupportedException { return super.clone(); } } //克隆 public class Main { public static void main(String[] args) throws Exception { Sheepfold fold = new Sheepfold(); fold.name = "小羊圈"; fold.sheep.setName("小羊"); Sheepfold fold2 = (Sheepfold)fold.clone(); System.out.println(" fold2.name = " + fold2.name); System.out.println(" fold2.sheep.getName() = " + fold2.sheep.getName()); fold2.name = "大羊圈"; fold2.sheep.setName("大羊"); System.out.println("====================================="); System.out.println(" fold2.name = " + fold2.name); System.out.println("* fold2.sheep.getName() = " + fold2.sheep.getName()); System.out.println(" fold.name = " + fold.name); System.out.println("* fold.sheep.getName() = " + fold.sheep.getName()); System.out.println("====================================="); } }
在这个例子中有三个类,Sheep和Sheepflod都实现了Cloneable接口,并且覆写了Object类的clone方法,说明这两个类是具有克隆能力的。注意一点,在Sheepflod中持有一个Sheep的实例,并在Main类中对其进行克隆,结果如下:
fold2.name = 小羊圈
fold2.sheep.getName() = 小羊
=====================================
fold2.name = 大羊圈
* fold2.sheep.getName() = 大羊
fold.name = 小羊圈
* fold.sheep.getName() = 大羊
=====================================
请
注意一下结果中带有"*"号的两条结果语句。fold2.sheep和fold.sheep的name都变为了"大羊",很奇怪是吗?在此之前,我们只对
fold2.sheep的name赋过值。为什么fold.sheep的name也变为了"大羊"呢?原因很简单,因为它们是指向同一个对象的不同引用。
从中可以看出,调用Object类中clone()方法时,首先在内存中划分一块同原对象相同的空间,然后将原对象的内容原样拷贝至新对象。我们知道,
java中有基本数据类型,对于基本数据类型,这样的操作是没有问题的,但对非基本类型变量,它们保存的仅仅是对象的引用,这也是为什么clone后非基
本类型变量和原对象中的变量指向同一个对象的原因。可能你已经注意到,程序中用到了String类型,即对象,为什么没有出现引用指向同一地址的情况?这
是因为String是一个不可更改的类(immutable class),每次给它赋值时,都会产生一个新的String对象。如 String
str = "a"; str += "b";在这两句代码中,当执行str += "b"时,实际上是重新成生了一个值为"ab"的
String对象,即重新分配了一块内存空间。以上clone方法通常被称为"影子clone"。"影子clone"给我们留下了一个问题,即多个引用指
向同一个对象。如何解决该问题呢?答案为"深度clone"。把上面的例子改成深度clone很简单,只需将Sheepfold的clone()方法改为
如下即可:
public Object clone() throws CloneNotSupportedException { Sheepfold fold = (Sheepfold)super.clone(); sheep = (Sheep)fold.sheep.clone(); return fold; }
发表评论
-
MyEclipse 6.0.1 注册码【注册机】
2013-02-05 10:44 8MyEclipse 6.0 注册机 一、从附件中下载文件 ... -
【转】Flash图表AnyChart应用教程九:创建图表模板
2012-12-14 09:34 1215创建 AnyChart 模板的思路是分离图表设置和数据部分,然 ... -
【转】Flash图表AnyChart应用教程八:创建向下钻取仪表盘
2012-12-14 09:34 1206用 AnyChart 创建向下钻取地图有两种方式:用AnyCh ... -
【转】Flash图表AnyChart应用教程七:自定义轴标签
2012-12-14 09:33 1311AnyChart 图表中的X,Y和任意轴可以自定义标签。本文就 ... -
【转】Flash图表AnyChart应用教程六:创建圆形仪表
2012-12-14 09:33 2072本教程将为你详细解析 ... -
【转】Flash图表AnyChart应用教程五:字体设置
2012-12-13 10:11 1507要设置AnyChart 图表上的字体,可以对AnyChart的 ... -
【转】Flash图表AnyChart应用教程四:如何改变轴标签属性
2012-12-13 10:08 1436有人问到如何自定义AnyChart 图表的轴标签属性,实际上, ... -
【转】Flash图表AnyChart应用教程三:在网页中嵌入flash地图
2012-12-13 10:06 1799AnyChart 是一款灵活的基于Flash/JavaScri ... -
【转】Flash图表AnyChart应用教程二:修改XML设置转换图表类型
2012-12-13 10:02 1092我们都知道,运用flash图表控件 AnyChart 可以创建 ... -
【转】Flash图表AnyChart应用教程一:创建交互式数字仪表盘
2012-12-13 09:51 1641仪表盘是商业智能领域必不可少的一个工具,然而大多数企业仪表盘目 ... -
Java调用com组件操作word
2010-03-30 20:40 5072一、准备工作 先了解一下概念,JACOB 就是 JAVA ... -
JAVA类包搜索引擎
2009-08-12 15:14 1917由于项目开发过程中遇到缺少某个class文件对 ... -
url 加密
2009-08-03 16:11 9684今天我有个朋 ... -
Java串口通信总结
2009-07-31 11:03 6088最近在研 ... -
java异常集说明
2009-03-09 16:39 1492算术异常类:ArithmeticExe ... -
Java异常框架中finally执行、及其他相关问题
2009-03-04 08:29 2977首先看一下异常处理的完整语法,如下: try{ ... -
一个有趣的问题
2009-02-23 09:24 795今天早上过来就看到有人提了这么一个有趣的问题: 有 ... -
开源网站内容管理系统——OpenCms
2009-01-07 15:51 3885之前给客户做 ... -
MessageDigest对密码进行加密
2008-12-17 14:02 2374通常情况下我们必须把用户密码存放到数据库,为了安全起见,我们需 ... -
用Java实现几种常见的排序算法
2008-12-16 14:21 1215用Java语言实现的各种排序,包括插入排序、冒泡排序、选择排序 ...
相关推荐
用 Java 语言编写的 初学者可学习的clone()
详细的描述了Java中 clone方法使用
java中clone的详细用法,分浅拷贝和深拷贝,并分别有详细的实例介绍。从原理分析。
对java clone的一些讲解,以及我个人的一些心得等等,
Java Clone(类的复制)实例代码 Java Clone(类的复制)实例代码
Java中的clone方法详解_动力节点Java学院,动力节点口口相传的Java黄埔军校
Java深浅clone测试代码 流拷贝 Cloneable
Clone 属性的相关内容 Clone 属性的相关内容
Java中的克隆(Clone)机制,很少涉及的内容。
主要介绍了 Java clone方法详解及简单实例的相关资料,需要的朋友可以参考下
clone的用法 希望有帮助,仅供参考 通过例子的分析,可以对克隆的方法有所深入了解
java code clone
今天小编就为大家分享一篇关于Java Clone深拷贝与浅拷贝的两种实现方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
java中clone的详细用法,分浅拷贝和深拷贝,并分别有详细的实例介绍。从原理分析。
clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。下面通过本文给大家介绍java中的clone方法,感兴趣的朋友一起看看吧
主要介绍了java 中clone()的使用方法的相关资料,希望通过本文能帮助大家能掌握clone()的克隆方法,需要的朋友可以参考下
java中仅有的创建对象的两种方式:①.使用new操作符创建对象;②....下面这篇文章主要通过JVM角度给大家详细谈谈Java的clone操作的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
Java中clone方法共6页.pdf.zip
NULL 博文链接:https://gaoquanyang.iteye.com/blog/1177183