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什么的?
问题比较菜,忘各位朋友多多指教

解决方案 »

  1.   

    我也是初学者,这是我参考core java2 的回答:1.cloneable接口的出现根接口的正常使用没有任何联系,在这里她只是作为一个标记(Cloneable是java的常用编辑接口之一,标记接口没有方法;他的唯一目的就是可以使用instanceof进行类型检查),说明类的使用者理解了克隆的过程。如果对象要求克隆,但没有实现此接口,会抛出一个已检查异常。 2.super是继承object类的方法,在child类中并没有重写clone方法,所以无法使用this,
    child的clone方法,只是将object类的clone方法的访问权限由protected变为public
      

  2.   

    我认为一般也不用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接口
    不对的地方请更正!
      

  3.   

    实现clone方法的关键就在于clone方法的实现.
    先implements Cloneable接口,调用super.clone()是用父类里实现好了的方法来结局克隆需要解决得问题;
    SUN对clone的解释是:
    按照惯例,此方法返回的对象应该独立于该对象(正被克隆的对象)。要获得此独立性,在 super.clone 返回对象之前,有必要对该对象的一个或多个字段进行修改。这通常意味着要复制包含正在被克隆对象的内部“深层结构”的所有可变对象,并使用对副本的引用替换对这些对象的引用。如果一个类只包含基本字段或对不变对象的引用,那么通常不需要修改 super.clone 返回的对象中的字段。 
    建议你了解以下"深拷贝"和"浅拷贝"的概念.
      

  4.   

    谢谢大家的回答:)
    结合两位的回答我又查了下资料,基本上摸清了点头绪。
    1.object的clone()是protected的,所以必须重写为public。
    2.Cloneable是“标记”接口的一个范例,接口自身不指定任何东西,但是,Object.clone检查类是否实现了它,如果没有就抛出一个CloneNotSupportedException异常。
    3.super问题正如gifted1982所说。我把资料归纳了一下 http://www.mycic.com.cn/bbs/viewthread.php?tid=353&fpage=1