当前位置:七道奇文章资讯编程技术Java编程
日期: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.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);
  }
} ///:~
一条Snake(蛇)由数段构成,每一段的范例都是Snake.所以,这是一个一段段链接起来的列表.全部段都是以循环方法成立的,每做好一段,城市使第一个构建器参数的值递减,直至终究为零.而为给每段赋予一个举世无双的标志,第二个参数(一个Char)的值在每次循环构建器调用时城市递增.
increment()办法的作用是循环递增每个标志,使我们能看到发生的改变;而toString则循环打印出每个标志.输出以下:
s = :a:b:c:d:e
s2 = :a:b:c:d:e
after s.increment, s2 = :a:c:d:e:f
这意味着只有第一段才是由Object.clone()复制的,所以此时举行的是一种“浅层复制”.若但愿复制整条蛇——即举行“深层复制”——必须在被覆盖的clone()里采纳附加的操作.
普通可在从一个能克隆的类里调用super.clone(),以确保全部底子类行动(包含Object.clone())可以举行.随着是为对象内每个句柄都明确调用一个clone();不然那些句柄会别名变成原始对象的句柄.构建器的调用也大致相同——首先构造底子类,然后是下一个衍生的构建器……以此类推,直到位于最深层的衍生构建器.辨别在于clone()并非个构建器,所以没有办法实现自动克隆.为了克隆,必须由自己明确举行.
  以上是“java Object.clone()的效果[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 利用Javascript实现网页水印(非图片水印)
  • Java开辟环境的搭建
  • Ubuntu java安装与配置
  • 办理Ubuntu 10.04 Firefox3.6 Java浏览器插件不工作的问
  • Ubuntu重装后Java环境的设置
  • Sun Java进入Ubuntu 10.10软件中央
  • Ubuntu 10.10配置Java开辟环境
  • 在Ubuntu 10.10中配置Java环境变量的办法
  • Ubuntu下Java环境的搭建
  • Ubuntu 10.04 下安装 Java, JRE
  • Ubuntu 10.04下的搭建SUN JAVA开辟环境
  • Ubuntu 12.04安装java7
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .