Java克隆(Clone)的应用

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

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

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

#
java

  简介:

  Java克隆(Clone)是Java语言的特性之一,但在实际中应用比较少见。但有时候用克隆会更方便更有效率。

  对于克隆(Clone),Java有一些限制:

  1、被克隆的类必须自己实现Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。Cloneable 接口实际上是个标识接口,没有任何接口方法。

  2、实现Cloneable接口的类应该使用公共方法重写 Object.clone(它是受保护的)。某个对象实现了此接口就克隆它是不可能的。即使 clone 方法是反射性调用的,也无法保证它将获得成功。

  3、在Java.lang.Object类中克隆方法是这么定义的:

  protected Object clone()

  throws CloneNotSupportedException

  创建并返回此对象的一个副本。表明是一个受保护的方法,同一个包中可见。

  按照惯例,返回的对象应该通过调用 super.clone 获得。

  引题:

  举个例子说吧,现在有一个对象比如叫foo,你需要在创建当前对象的一个副本作为存根你能怎么做?

  假如你不用Clone,那么你可以先new一个对象foo1:Foo foo1=new Foo(),然后用foo给foo1对象set值,这样就得到foo的副本foo1;除此之外,别无选择。

  这样说,也许有人会觉得说的过于绝对了,不过事实如此啊。

  要产生一个副本,那副本要不要内存?----当然要了,那就对了!既然需要内存,(不克隆的情况下)你不new还有什么办法呢?请大家时刻铭记对象是Java运行时产生的,驻留在计算机内存中。

  常见错误:

  下面我澄清几个初学者容易犯迷糊的错误,同样的问题,产生foo对象的副本:

  1、Foo foo1=new Foo();

  foo1=foo;

  然后就想当然的认为副本foo1生成了!

  错误原因:foo1没错是申请了内存,但是执行foo1=foo后,foo1就不在指向刚申请的内存区域了,转而指向foo对象的内存区域,这时候,foo1、foo指向了同一内存区域。刚才new的操作制造一堆垃圾等着JVM回收。

  2、Foo foo1=foo;

  错误原因:还是两个变量都指向了同一块内存。

  3、有些老鸟更厉害一些:在Foo中定义一个返回自身的方法:

  public Foo getInstance(){

  return this;

  }

  然后,Foo foo1=foo.getInstance();

  错误原因:同上,主要还是没有重新开辟内存,this在对象里是什么?----就是对象自己的引用!那么getInstance()自然返回的就是对象自己,反正又是两个对象穿了一条裤子----***,哈哈。错得心服口服吧。为了节省篇幅,我在最后写个例子,留给那些对此有异议的人看。

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号