Java克隆(Clone)的应用

发表于:2010-1-19 10:41

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

  Java代码

  /**
  * Created by IntelliJ IDEA.
  * User: leizhimin
  * Date: 2007-9-20
  * Time: 19:52:01
  * 测试类:分别克隆CloneFooA和CloneFooB类,并打印克隆前后的结果.
  */
  public class CloneDemo {
  public static void main(String args[]) throws CloneNotSupportedException {
  //CloneFooA克隆前
  CloneFooA fooA1 = new CloneFooA("FooA", 11);
  System.out.println("CloneFooA的对象克隆前对象fooA1值为: " + fooA1.getStrA() + "," + fooA1.getIntA());
  //CloneFooA克隆后
  CloneFooA fooA2 = (CloneFooA) fooA1.clone();
  System.out.println("CloneFooA的对象克隆后对象fooA2值为: " + fooA2.getStrA() + "," + fooA2.getIntA());
  //比较fooA1和fooA2内存地址
  if (fooA1 == fooA2) System.out.println("比较fooA1和fooA2内存地址:相等!");
  else System.out.println("比较fooA1和fooA2内存地址:不相等!");
  System.out.println("-------------------------");
  //CloneFooB克隆前
  CloneFooB fooB1 = new CloneFooB(fooA1, new Double("33"));
  System.out.println("CloneFooB的对象克隆前对象fooB1值为: " + fooB1.getFooA().getStrA() + "," + fooB1.getFooA().getIntA() + " | " + fooB1.getDouB());
  //CloneFooB克隆后
  CloneFooB fooB2 = (CloneFooB) fooB1.clone();
  System.out.println("CloneFooB的对象克隆前对象fooB2值为: " + fooB2.getFooA().getStrA() + "," + fooB2.getFooA().getIntA() + " | " + fooB2.getDouB());
  if (fooA1 == fooA2) System.out.println("比较fooB1和fooB2内存地址:相等!");
  else System.out.println("比较fooB1和fooB2内存地址:不相等!");
  }
  }

  运行结果:

  CloneFooA的对象克隆前对象fooA1值为: FooA,11

  CloneFooA的对象克隆后对象fooA2值为: FooA,11

  比较fooA1和fooA2内存地址:不相等!

  -------------------------

  CloneFooB的对象克隆前对象fooB1值为: FooA,11 | 33.0

  CloneFooB的对象克隆前对象fooB2值为: FooA,11 | 33.0

  比较fooB1和fooB2内存地址:不相等!

  反面教材:

  最后,我给出我上面提出到最后要给出的反面例子。

  随便写一个,在CloneFooA 的基础上做了少许改动,内容如下:

  Java代码

  public class CloneFooA implements Cloneable {
  private String strA;
  private int intA;
  public CloneFooA(String strA, int intA) {
  this.strA = strA;
  this.intA = intA;
  }
  public String getStrA() {
  return strA;
  }
  public void setStrA(String strA) {
  this.strA = strA;
  }
  public int getIntA() {
  return intA;
  }
  public void setIntA(int intA) {
  this.intA = intA;
  }
  /**
  * @return 创建并返回此对象的一个副本。
  * @throws CloneNotSupportedException
  */
  public Object clone() throws CloneNotSupportedException {
  //直接调用父类的clone()方法,返回克隆副本
  return super.clone();
  }
  /**
  * @return 返回运行时的对象
  */
  public CloneFooA getInstance(){
  return this;
  }
  public static void main(String args[]){
  CloneFooA fooA=new CloneFooA("aa",11);
  System.out.println(fooA.getStrA()+"  "+fooA.getIntA());
  CloneFooA fooA1=fooA.getInstance();
  System.out.println(fooA1.getStrA()+"  "+fooA1.getIntA());
  if(fooA==fooA1) System.out.println("fooA和fooA1内存地址相等!");
  System.out.println("-------------------------");
  //改变后fooA或者fooA1中任何一个,看看另外一个是否会改变
  fooA1.setStrA("bb");
  System.out.println(fooA.getStrA()+"  "+fooA.getIntA());
  System.out.println(fooA1.getStrA()+"  "+fooA1.getIntA());
  if(fooA==fooA1) System.out.println("fooA和fooA1内存地址相等,改变fooA1后,fooA的值也跟着变化了");
  }
  }

  运行结果:

  aa  11
  aa  11
  fooA和fooA1内存地址相等!
  -------------------------
  bb  11
  bb  11
  fooA和fooA1内存地址相等,改变fooA1后,fooA的值也跟着变化了。

33/3<123
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号