java里面假如要克隆某个对象,那么就要去实现Object的clone()方法,和去实现接口Cloneable,请问一下,为什么要去实现clone,方法呢??希望简单,易理解

解决方案 »

  1.   

    Cloneable是一个interface,里面定义了clone()方法,但是未实现它,所以希望你自己去实现。
    如何实现呢? 如下:
    public Animals Clone()
    {
      Animals obj = new Animals();
     return obj;
    }
      

  2.   

    之所以实现一个标准的接口,就是为了让其他使用你的类的时候可以很方便的调用clone(),
    如果你非得用其他的名字实现clone,没有问题,不过你得逐个通知所有可能使用这个类的人了,因为他们是实现一个标准的通用的接口
      

  3.   

    2楼错了吧.Cloneable是一个空的接口,3楼的是意思,不怎么明白,能详细点吗...
      

  4.   

    不好意思,我写错了,我想问的是为什么建议我们去重写Object的clone方法呢,不重写好象也没影响啊,而且为什么要去实现Cloneable这个空接口呢??迷茫.....
      

  5.   

    首先,Cloneable 这个接口仅做标识用,用于告诉调用者,“这个 class 是 cloneable 的”。不过,如果你的 class 仅仅实现了这个接口,那是不够的。根据 JDK 文档,实现这个接口的同时,还要重写 clone() 方法。直接的理由很简单,如果不重写的话,Object.clone() 是 protected 的,不能被外部调用,重写时要改成 public 才可以。至于“为什么要这样设计”,我想,可能是因为,实际使用 clone() 的场合大多数都需要的是“deep copy”,而 Object.clone() 实现的只是一个 field-to-field 的“shallow copy”,所以,要自己实现 clone() 方法对 Object reference 型的成员再进行 clone()。再进一步,至于为什么 Object.clone() 不直接实现成“deep copy”,我想,可能是因为那样就太过分了,实际使用时并不一定都是完全的 deep copy,也许有些成员只要 shallow copy 就够了。所以,还是把具体实现的方法交给程序员决定。
      

  6.   

    “首先,Cloneable   这个接口仅做标识用,用于告诉调用者,“这个   class   是   cloneable   的”。 ”理论上讲,我不去实现Cloneable ,仅仅去改写clone方法,逻辑上是也说得过去的。
      

  7.   

    而且实际上也行得通,所以,5楼说“Cloneable 这个接口仅做标识用”是很准确的。它只是告诉读程序的人,这个类改写了继承自Object的clone方法,实现了深拷贝。
      

  8.   

    再问一下,Object并没有给clone()这个方法进行任何操作,他的克隆是怎么形成的呢???
    Object里的clone()的方法: protected native Object clone() throws CloneNotSupportedException;
      

  9.   

    Object的clone方法实际上是有定义的,就是把原本对象的成员变量的值赋给副本对象对应的成员变量。
      

  10.   

    曾经搞swing开发(实现copy,undo,redo,paste功能)时碰到过clone问题(deep copy),深受其害。
    在这里看到这样的帖子,顶下先。
      

  11.   

    但是,Object类本身不能使用clone方法复制,那样会抛出异常。任何一个类,如果想使用从Object继承过来的clone方法,就必须首先改写它;从Object直接继承过来的clone方法不能使用。