class Test implements Cloneable
{
Object o=null;
String name;

Test(String name)
{
this.name=name;
} public Object clone()
{
try
{
o=super.clone();     //为什么要调用这句?
}
catch(Exception e)
{
System.out.println(e.toString());
}
return o;
}
}super.clone(); 调用父类的 clone() 方法,这里又不是要复制父类对象。

解决方案 »

  1.   

    子类对象实际上是在父类对象的基础上做了一些扩展(extension),extends关键词就说明了这一点,所以,任何一个子类对象实际中其中有一部分是存储的父类对象的数据,也正是这个原因,一个子类对象才可以向上转型为父类的对象。
    调用super.clone();就表示在复制子类对象的时候,一定要使得父类对象的那部分数据能够得到复制。
      

  2.   

    子类是父类的扩展 你只有一层一层的调用父类的clone方法 才能最终获得子类的实例  你新建一个对象的时候不是也要先调用父类的构造函数么!
      

  3.   

    若一个对象持有指向其他对象的引用,如果克隆时能够同时把指向的对象克隆一份,这就是深层克隆,而浅层克隆就是只复制引用,而不会把指向的对象克隆一份。
    建议读一读《Thinking in java》,附录中有一部分讲这个。
      

  4.   

    但在clone()方法中,只有 o=super.clone(); 一句。难道只要复制父类,而自己不用复制吗?
      

  5.   

    复制分为深复制和浅复制两种,所谓浅复制就是说最终返回的对象,其内部成员和原始对象的内部成员指向同一位置,只不过是别名而已;而深复制,就是说最终返回的对象,其内部成员都是在内存中分配了空间的独立对象。下面给个深复制的例子:
      注:上面说的内部成员是指对象,不包括原始类型(int,float等)。
    /**
       * 实现深复制,通过 (前提,该对象中的各个属性都是可serielization的)
       * @return Object
       */
      public Object clone(){
        ByteArrayOutputStream oo = new ByteArrayOutputStream();
        ObjectOutputStream out = null ;
        try {
          out = new ObjectOutputStream(oo);
        }
        catch (IOException ex) {
        }    try {
          out.writeObject(this);
        }
        catch (IOException ex1) {
        }    ByteArrayInputStream ii = new ByteArrayInputStream(oo.toByteArray());
        ObjectInputStream in = null;
          try {
            in = new ObjectInputStream(ii);
          }
          catch (IOException ex2) {
          }    try {
          return in.readObject();
        }
        catch (ClassNotFoundException ex3) {
          return null;
        }
        catch (IOException ex3) {
          return null;
        }
        }
      

  6.   

    但在clone()方法中,只有 o=super.clone(); 一句。难道只要复制父类,而自己不用复制吗?
      

  7.   

    我现在就是不明白下面的问题:
    在clone()方法中,只有 o=super.clone(); 一句。难道只要复制父类,而自己不用复制吗?
      

  8.   

    clone()方法是Object类的一个proteced方法.有就是说,不能直接去调用它.只有在某一个类里面才能调用这一个类的对象.这种限制当然有他的一定道理.至于为什么我就懒得去研究了,发时间在这不如发时间去看点其他东西.
    然后一点就是重写默认的 clone方法,必须使用super.clone()方法,调用父类的clone方法.
    重写这个默认的clone方法,还是要把浅克隆通过super.clone()方法实现深克隆.不知道能不能这么说明...最少偶是明白了这个道理了的=.-=
      

  9.   


    class  Test  implements  Cloneable  
    {  
    Object  o=null;  
    String  name;  

    Test(String  name)  
    {  
    this.name=name;  
    }  

    public  Object  clone()  
    {  
    try  
    {  
    o=super.clone();          //为什么要调用这句?  
    }  
    catch(Exception  e)  
    {  
    System.out.println(e.toString());  
    }  
    return  o;  
    }  
    public static void main(String[] args)
    {
    Test one=new Test("one");
    Test two=(Test)one.clone();
    System.out.println(two.name);
    }}那就看上面的代码:
    Test two=(Test)one.clone();
    调用 one 的 clone 方法,也就是调用 super.clone()。 然而在下面的语句 System.out.println(two.name); 却打印出 one ,为什么?super.clone() 只复制了父类对象,并没有复制子类的 name 属性。
      

  10.   

    Object 类的 clone 方法执行特定的克隆操作。首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException。。否则,此方法会创建此对象的类的一个新实例,并像通过分配那样,严格使用此对象相应字段的内容初始化该对象的所有字段;这些字段的内容没有被自我克隆。所以,此方法执行的是该对象的“浅表复制”,而不“深层复制”操作。