带你揭开Java clone技术的神秘面纱

瞎子看百态

瞎子看百态

2016-02-19 18:37

下面是个超简单的带你揭开Java clone技术的神秘面纱教程,图老师小编精心挑选推荐,大家行行好,多给几个赞吧,小编吐血跪求~

  Clone基本知识储备
  在Java里提到clone技术,就不能不提java.lang.Cloneable接口和含有clone方法的Object类。所有具有clone功能的类都有一个特性,那就是它直接或间接地实现了Cloneable接口。否则,我们在尝试调用clone()方法时,将会触发CloneNotSupportedException异常。下面我们通过对Object类的部分源码的分析,来发现和理解这一特性。请看JDK中Object# clone()方法的源码:
  
  /*
  
  …………
  
  * @return a clone of this instance.
  * @exception? CloneNotSupportedException? if the object''s class does not
  *support the Cloneable interface. Subclasses
  *that override the clone method can also
  * throw this exception to indicate that an instance cannot
  *be cloned.
  * @see java.lang.Cloneable
  */
  
  
  protected native Object clone() throws CloneNotSupportedException;
  

  
  
  这段源码的@exception部分的描述内容证实了上文关于clone对象特性论断的正确性。它明确指出对象类必须支持Cloneable接口,否则即使派生类覆盖了Object#clone()方法,也同样会抛出CloneNotSupportedException这个异常。关于覆盖clone()方法,后续文章将会用专门篇幅进行比较具体的分析.
  
  
  在上一篇中,介绍了java里clone的基本知识。本篇将着重描述如何实现clone。
  
  
  
  
  
  l clone的实现
  
  1.实现Cloneable接口
  
  通过上一篇的介绍,我们知道,一个类若要具备clone功能,就必须实现Cloneable接口。做到这一步,clone功能已经基本实现了。Clone功能对我们来说,最主要的还是要能够使用它。那么我们如何才能使用clone功能呢?答案是覆盖Object#clone()方法。
  
  2. 覆盖Object#clone()方法
  
  为什么需要覆盖Object#clone()方法?这里得再次从jdk源码说起。JDK中Object# 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。接下来的篇幅将就纵深clone等clone的高级特性进行分析。
  

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  本章将进入clone的高级特性,着重讲述纵深clone技术。
  
  Clone通常有两种类型即浅clone和深clone。首先,分析一下两种的不同。浅clone和深clone都是clone,它们本质区别是对象内部的成员属性(非原生类型属性,如int等)在clone时是否处理为引用。

展开更多 50%)
分享

猜你喜欢

带你揭开Java clone技术的神秘面纱

编程语言 网络编程
带你揭开Java clone技术的神秘面纱

揭开Java 安全标准的神秘面纱

编程语言 网络编程
揭开Java 安全标准的神秘面纱

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

揭开ASP神秘面纱(4)

ASP
揭开ASP神秘面纱(4)

揭开ASP神秘面纱(1)

ASP
揭开ASP神秘面纱(1)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

揭开ASP神秘面纱(2)

ASP
揭开ASP神秘面纱(2)

揭开ASP神秘面纱(5)

ASP
揭开ASP神秘面纱(5)

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Win7系统下安装xp系统教程

Win7系统下安装xp系统教程

XML数据岛

XML数据岛
下拉加载更多内容 ↓