深入浅出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的高级特性进行分析。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值