关于克隆的接口问题
class Child implements Cloneable
{
int a;
String ss;
public Object clone()
{
Object o=null;
try
{
o=super.clone();
}
catch(CloneNotSupportedException e)
{
System.out.println(e.toString());
}
return o;
}
}
1:为什么要加“implements Cloneable”这个接口呢?我觉得Child不是继承于object么,那为什么不用直接调用clone这个方法?
2:o=super.clone();为什么用super,而不是this什么的?
问题比较菜,忘各位朋友多多指教
问题点数:20、回复次数:5Top
1 楼gifted1982(玩游戏的Coder)回复于 2006-02-02 13:56:09 得分 10
我也是初学者,这是我参考core java2 的回答:
1.cloneable接口的出现根接口的正常使用没有任何联系,在这里她只是作为一个标记(Cloneable是java的常用编辑接口之一,标记接口没有方法;他的唯一目的就是可以使用instanceof进行类型检查),说明类的使用者理解了克隆的过程。如果对象要求克隆,但没有实现此接口,会抛出一个已检查异常。
2.super是继承object类的方法,在child类中并没有重写clone方法,所以无法使用this,
child的clone方法,只是将object类的clone方法的访问权限由protected变为publicTop
2 楼TK2006(改个名,好听点~~)回复于 2006-02-02 13:58:48 得分 5
我认为一般也不用implements Cloneable的,直接调用clone()方法就可以了。
除非在必要时,你的类需要重写clone()方法,如
class A
{
...
B b=new B();//类A中有类B的引用
'''
}
public class test
{
...
A a=new A();//创建一个A的对象a
A c=(A)a.clone();//克隆a,生成了另一个对象c
...
}
其实,此时c与a并不是彻底的两个独立的对象了,其实a与c中的对象b都是指向同一块内存
故应该重写A的clone()方法,实现Cloneable接口
不对的地方请更正!Top
3 楼cataclyam2000(zhangjun)回复于 2006-02-02 14:14:45 得分 5
实现clone方法的关键就在于clone方法的实现.
先implements Cloneable接口,调用super.clone()是用父类里实现好了的方法来结局克隆需要解决得问题;
SUN对clone的解释是:
按照惯例,此方法返回的对象应该独立于该对象(正被克隆的对象)。要获得此独立性,在 super.clone 返回对象之前,有必要对该对象的一个或多个字段进行修改。这通常意味着要复制包含正在被克隆对象的内部“深层结构”的所有可变对象,并使用对副本的引用替换对这些对象的引用。如果一个类只包含基本字段或对不变对象的引用,那么通常不需要修改 super.clone 返回的对象中的字段。
建议你了解以下"深拷贝"和"浅拷贝"的概念.Top
4 楼zhangzhentao()回复于 2006-02-02 14:15:12 得分 0
谢谢大家的回答:)
结合两位的回答我又查了下资料,基本上摸清了点头绪。
1.object的clone()是protected的,所以必须重写为public。
2.Cloneable是“标记”接口的一个范例,接口自身不指定任何东西,但是,Object.clone检查类是否实现了它,如果没有就抛出一个CloneNotSupportedException异常。
3.super问题正如gifted1982所说。
我把资料归纳了一下 http://www.mycic.com.cn/bbs/viewthread.php?tid=353&fpage=1Top
5 楼wylsx(小小de鸟)回复于 2006-02-02 14:59:45 得分 0
dingTop




