别岸Beyond 的专栏

曾经的CPlusPlus人生

深入浅出Java clone技术(2)

 

在上一篇中,介绍了javaclone的基本知识。本篇将着重描述如何实现clone

 

l clone的实现

1.实现Cloneable接口

通过上一篇的介绍,我们知道,一个类若要具备clone功能,就必须实现Cloneable接口。做到这一步,clone功能已经基本实现了。Clone功能对我们来说,最主要的还是要能够使用它。那么我们如何才能使用clone功能呢?答案是覆盖Object#clone()方法。

2. 覆盖Object#clone()方法

为什么需要覆盖Object#clone()方法?这里得再次从jdk源码说起。JDKObject# clone()方法的原型是:

protected native Object clone() throws CloneNotSupportedException;

是否注意到,这里clone()方法修饰符是protected,而不是public。这种访问的不可见性使得我们对Object#clone()方法不可见。相信读者已明白为什么要覆盖Object#clone()方法。而且,覆盖的方法的修饰符必须是public,如果还保留为protected,覆盖将变得没有实际意义。下面举一个具有clone功能的简单的例子:

/*

     * 具有clone功能的类的例子

*/

public class CloneableObjExample implements Cloneable {

//……部分代码已省略……

      private String name = null;

private int score = 0;

 

   /**

* NOTE: protected 修饰符 更改为 public

* @see java.lang.Object#clone()

 */

 public/*protected*/ Object clone() throws CloneNotSupportedException {

    // call父类的clone方法

    Object result = super.clone();

     //TODO: 定制clone数据

    return result;

}

}

3.定制clone

至此,clone已经真相大白。Clone的对象我们可以对其进行定制。还就上面的例子来说。下面的方法对功能做了一定的增强:

public/*protected*/ Object clone() throws CloneNotSupportedException {

  // call父类的clone方法

  CloneableObjExample result = (CloneableObjExample)super.clone();

  //TODO: 定制clone数据

  //虽然”clone”了,但还可以做点调整

    result.name = “New Name”;

    result.score = 90;

    return result;

}

 

本篇介绍了如何实现clone。接下来的篇幅将就纵深cloneclone的高级特性进行分析。

阅读更多
个人分类: Java/J2EE
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭