A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 而今从头越2012 中级黑马   /  2013-1-2 16:53  /  1404 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面有段代码:
/**
* 实现克隆技术,必须实现Cloneable接口
* @author XuCheng
*
*/
public class OnePerson implements Cloneable {
private String name = null;
public OnePerson(String name){
  this.name = name;
}
public String getName() {
  return name;
}
public void setName(String name) {
  this.name = name;
}

//需要子类覆写clone方法
public Object close() throws CloneNotSupportedException{
  return super.clone();
}

public String toString(){
  return "姓名:" + this.getName();
}
}
请教大家,关于克隆技术的用法,为什么会出现克隆技术,克隆技术有哪些实用的价值,请用代码演示,谢谢!

1 个回复

倒序浏览
本帖最后由 张会文 于 2013-1-2 17:29 编辑

Clone基本知识储备 在Java里提到clone技术,就不能不提java.lang.Cloneable接口和含有clone方法的Object类。所有具有clone功能的类都有一个特性,那就是它直接或间接地实现了Cloneable接口。否则,我们在尝试调用clone()方法时,将会触发CloneNotSupportedException异常。 下面我们通过对Object类的部分源码的分析,来发现和理解这一特性。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功能的简单的例子:
  1. /* * 具有clone功能的类的例子 */
  2. public class CloneableObjExample implements Cloneable {
  3. //……部分代码已省略……
  4. private String name = null;
  5. private int score = 0;
  6. /** * NOTE: 将protected 修饰符 更改为 public
  7. * @see java.lang.Object#clone() */
  8. public/*protected*/
  9. Object clone() throws CloneNotSupportedException {
  10. // call父类的clone方法
  11. Object result = super.clone(); //TODO: 定制clone数据
  12. 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。首先,分析一下两种的不同。浅clone和深clone都是clone,它们本质区别是对象内部的成员属性(非原生类型属性,如int等)在clone时是否处理为引用。如果仍然保留为引用,则称为浅clone,反之称为深clone。其实这两个概念也是相对的概念。在处理上它们有点区别,浅clone方式得到clone对象即可,深clone方式在得到clone对象后,还需要对引用的成员属性进行“clone”处理。从这个层次上说,深clone并没有什么特别地困难,简单讲就是创建好对象,再设置一些成员属性。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马