日期:2011-03-22 16:17:00 来源:本站整理
java的clone实现[Java编程]
本文“java的clone实现[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
理解了实现clone()办法背后的全部细节后,便可成立出能便利复制的类,以便供应了一个本地副本:
不管怎样,clone()必须可以拜候,所以必须将其设为public(大众的).其次,作为clone()的早期行动,应调用clone()的底子类版本.这里调用的clone()是Object内部预先定义好的.之所以能调用它,是由于它具有protected(遭到保护的)属性,所以能在衍生的类里拜候.//: LocalCopy.java // Creating local copies with clone() import java.util.*; class MyObject implements Cloneable { int i; MyObject(int ii) { i = ii; } public Object clone() { Object o = null; try { o = super.clone(); } catch (CloneNotSupportedException e) { System.out.println("MyObject can't clone"); } return o; } public String toString() { return Integer.toString(i); } } public class LocalCopy { static MyObject g(MyObject v) { // Passing a handle, modifies outside object: v.i++; return v; } static MyObject f(MyObject v) { v = (MyObject)v.clone(); // Local copy v.i++; return v; } public static void main(String[] args) { MyObject a = new MyObject(11); MyObject b = g(a); // Testing handle equivalence, // not object equivalence: if(a == b) System.out.println("a == b"); else System.out.println("a != b"); System.out.println("a = " + a); System.out.println("b = " + b); MyObject c = new MyObject(47); MyObject d = f(c); if(c == d) System.out.println("c == d"); else System.out.println("c != d"); System.out.println("c = " + c); System.out.println("d = " + d); } } ///:~
Object.clone()会查抄原先的对象有多大,再为新对象腾出充足多的内存,将全部二进制位从本来的对象复制到新对象.这叫作“按位复制”,并且按普通的设法,这个工作应当是由clone()办法来做的.但在Object.clone()正式开始操作前,首先会查抄一个类能否Cloneable,便能否具有克隆本领——换言之,它能否实现了Cloneable接口.若未实现,Object.clone()就掷出一个CloneNotSupportedException违例,指出我们不能克隆它.因此,我们最好用一个try-catch块将对super.clone()的调用代码包抄(或封装)起来,试图捕捉一个该当永不呈现的违例(因为这里确切已实现了Cloneable接口).
在LocalCopy中,两个办法g()和f()揭暴露两种参数传送办法间的差别.此中,g()演示的是按引用传送,它会改正外部对象,并返回对那个外部对象的一个引用.而f()是对自变量举行克隆,所以将其别离出来,并让本来的对象保持独立.随后,它持续做它但愿的事情.乃至能返回指向这个新对象的一个句柄,并且不会对本来的对象产生任何副作用.注意下面这个多少有些古怪的语句:
v = (MyObject)v.clone();
它的作用恰是成立一个本地副本.为避免被这样的一个语句搞混合,记着这种相当奇特的编码情势在Java中是完好答应的,因为有一个名字的全部东西实际都是一个句柄.所以句柄v用于克隆一个它所指向的副本,并且终究返回指向底子范例Object的一个句柄(因为它在Object.clone()中是那样被定义的),随后必须将其造型为精确的范例.
在main()中,两种差别参数传送方法的辨别在于它们辨别测试了一个差别的办法.输出后果以下:
大家要记着这样一个事实:Java对“能否等价”的测试并不对所对比对象的内部举行查抄,从而核实它们的值能否相同.==和!=运算符只是简单地比较句柄的内容.若句柄内的地址相同,就认为句柄指向一样的对象,所以认为它们是“等价”的.所以运算符真正检测的是“由于别名问题,句柄能否指向同一个对象?”a == b a = 12 b = 12 c != d c = 47 d = 48
以上是“java的clone实现[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:java重定向尺度IO
- ·下一篇文章:使类具有克隆本领
- ·中查找“java的clone实现”更多相关内容
- ·中查找“java的clone实现”更多相关内容
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论