黑马程序员技术交流社区
标题:
java中克隆技术的疑问
[打印本页]
作者:
而今从头越2012
时间:
2013-1-2 16:53
标题:
java中克隆技术的疑问
下面有段代码:
/**
* 实现克隆技术,必须实现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();
}
}
请教大家,关于克隆技术的用法,为什么会出现克隆技术,克隆技术有哪些实用的价值,请用代码演示,谢谢!
作者:
张会文
时间:
2013-1-2 17:26
本帖最后由 张会文 于 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功能的简单的例子:
/* * 具有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。首先,分析一下两种的不同。浅clone和深clone都是clone,它们本质区别是对象内部的成员属性(非原生类型属性,如int等)在clone时是否处理为引用。如果仍然保留为引用,则称为浅clone,反之称为深clone。其实这两个概念也是相对的概念。在处理上它们有点区别,浅clone方式得到clone对象即可,深clone方式在得到clone对象后,还需要对引用的成员属性进行“clone”处理。从这个层次上说,深clone并没有什么特别地困难,简单讲就是创建好对象,再设置一些成员属性。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2