为什么克隆不工作?

时间:2014-07-01 15:38:27

标签: java oop

线程中的异常" main" java.lang.RuntimeException:无法编译的源代码未报告的异常java.lang.CloneNotSupportedException;必须被抓住或宣布被抛出 在Test.main(Test.java:13) Java结果:1

 public class  Color
 {
     public String ColorName()
     {
         return "Red";
     }
 }
 public class Test extends Color
 {
    public static void main(String args[])
    {
       Color MyShirt = new Color();
       Color MyBag = (Color) MyShirt.clone();

       System.out.println(MyShirt.ColorName());
       System.out.println(MyBag.ColorName());
    }
 }

4 个答案:

答案 0 :(得分:2)

因为您没有实施CloneableObject的默认实施clone()只会抛出CloneNotSupportedException;我想你想要这样的东西

public class Color implements Cloneable {
  protected String name = "Red";

  public String ColorName() {
    return name;
  }

  @Override
  public Object clone() {
    Color c = new Color();
    c.name = this.name;
    return c;
  }
}

答案 1 :(得分:1)

您的类必须实现java.lang.Cloneable接口。

public class  Color implements Cloneable
{
    public String ColorName()
    {
        return "Red";
    }

    @Override
    public Color clone() {
        //return your cloned Color instance
    }
}

答案 2 :(得分:1)

您的类没有实现Cloneable接口,因此抛出了此异常的原因。这可以在Java API中找到。

答案 3 :(得分:1)

其他答案是正确的,指出您的类需要实现Clonable并覆盖clone()方法才能按预期工作:

class Color implements Clonable{
    @Override 
    public Color clone(){
        Color c = new Color();
        c.name = this.name;
        return c;
    }
    // other methods
}

然而,关于clone()最重要的是你应该总是避免使用它。

Joshua Bloch在他的书"Effective Java"中解释说,clone()已被彻底打破,正确地建议使用复制构造函数。您可以阅读更多相关信息here

您应该声明一个像这样的复制构造函数,而不是使用clone()

class Color{
    public Color(){ /* ... */ } // default constructor
    public Color(Color c){
        this.name = c.name; // copy all attributes
    }
    // other methods
}

然后用它来复制对象:

Color c = new Color();
Color other = new Color(c); // returns a copy of c