日期:2011-03-22 16:17:00 来源:本站整理
java Object.clone()的效果[Java编程]
本文“java Object.clone()的效果[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
调用Object.clone()时,实际发生的是什么事情呢?当我们在自己的类里覆盖clone()时,什么东西关于super.clone()来说是最关键的呢?根类中的clone()办法负责成立精确的存储容量,并通过“按位复制”将二进制位从原始对象中复制到新对象的存储空间.也就是说,它并不只是预保存储空间以及复制一个对象——实际需求调查出欲复制之对象的精确大小,然后复制那个对象.由于全部这些工作都是在由根类定义之clone()办法的内部代码中举行的(根类并不知道要从自己这里担当出去什么),所以大家大概已经猜到,这个历程需求用RTTI判断欲克隆的对象的实际大小.采纳这种方法,clone()办法便可成立起精确数目的存储空间,并对那个范例举行精确的按位复制.
不管我们要做什么,克隆历程的第一个部份普通都应当是调用super.clone().通过举行一次精确的复制,这样做可为后续的克隆进程成立起一个杰出的底子.随后,可采纳另一些必要的操作,以完成终究的克隆.
为切当理解其他操作是什么,首先要精确理解Object.clone()为我们带来了什么.分外地,它会自动克隆全部句柄指向的目标吗?下面这个例子可完成这种情势的检测:
一条Snake(蛇)由数段构成,每一段的范例都是Snake.所以,这是一个一段段链接起来的列表.全部段都是以循环方法成立的,每做好一段,城市使第一个构建器参数的值递减,直至终究为零.而为给每段赋予一个举世无双的标志,第二个参数(一个Char)的值在每次循环构建器调用时城市递增.//: Snake.java // Tests cloning to see if destination of // handles are also cloned. public class Snake implements Cloneable { private Snake next; private char c; // Value of i == number of segments Snake(int i, char x) { c = x; if(--i > 0) next = new Snake(i, (char)(x + 1)); } void increment() { c++; if(next != null) next.increment(); } public String toString() { String s = ":" + c; if(next != null) s += next.toString(); return s; } public Object clone() { Object o = null; try { o = super.clone(); } catch (CloneNotSupportedException e) {} return o; } public static void main(String[] args) { Snake s = new Snake(5, 'a'); System.out.println("s = " + s); Snake s2 = (Snake)s.clone(); System.out.println("s2 = " + s2); s.increment(); System.out.println( "after s.increment, s2 = " + s2); } } ///:~
increment()办法的作用是循环递增每个标志,使我们能看到发生的改变;而toString则循环打印出每个标志.输出以下:
这意味着只有第一段才是由Object.clone()复制的,所以此时举行的是一种“浅层复制”.若但愿复制整条蛇——即举行“深层复制”——必须在被覆盖的clone()里采纳附加的操作.s = :a:b:c:d:e s2 = :a:b:c:d:e after s.increment, s2 = :a:c:d:e:f
普通可在从一个能克隆的类里调用super.clone(),以确保全部底子类行动(包含Object.clone())可以举行.随着是为对象内每个句柄都明确调用一个clone();不然那些句柄会别名变成原始对象的句柄.构建器的调用也大致相同——首先构造底子类,然后是下一个衍生的构建器……以此类推,直到位于最深层的衍生构建器.辨别在于clone()并非个构建器,所以没有办法实现自动克隆.为了克隆,必须由自己明确举行.
以上是“java Object.clone()的效果[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论