当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:17:00  来源:本站整理

java的clone实现[Java编程]

赞助商链接



  本文“java的clone实现[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
理解了实现clone()办法背后的全部细节后,便可成立出能便利复制的类,以便供应了一个本地副本:
//: 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);
  }
} ///:~
不管怎样,clone()必须可以拜候,所以必须将其设为public(大众的).其次,作为clone()的早期行动,应调用clone()的底子类版本.这里调用的clone()是Object内部预先定义好的.之所以能调用它,是由于它具有protected(遭到保护的)属性,所以能在衍生的类里拜候.
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()中,两种差别参数传送方法的辨别在于它们辨别测试了一个差别的办法.输出后果以下:
a == b
a = 12
b = 12
c != d
c = 47
d = 48
大家要记着这样一个事实:Java对“能否等价”的测试并不对所对比对象的内部举行查抄,从而核实它们的值能否相同.==和!=运算符只是简单地比较句柄的内容.若句柄内的地址相同,就认为句柄指向一样的对象,所以认为它们是“等价”的.所以运算符真正检测的是“由于别名问题,句柄能否指向同一个对象?”
  以上是“java的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 .