【问题标题】:why clone not working?为什么克隆不起作用?
【发布时间】:2014-08-22 05:59:35
【问题描述】:

线程“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());
    }
 }

【问题讨论】:

标签: java oop


【解决方案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

【讨论】:

    【解决方案2】:

    您的类没有实现 Cloneable 接口,这就是引发此异常的原因。这可以在 Java API 中找到。

    【讨论】:

      【解决方案3】:

      因为你没有实现Cloneable,而Object有一个默认实现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;
        }
      }
      

      【讨论】:

      • 这不是真的:“对象有一个默认的 clone() 实现, 抛出 CloneNotSupportedException”。阅读 API,实现 Cloneable 将导致 Object 的 clone() 返回一个浅拷贝,因此按照惯例应该在覆盖时调用 super.clone()。重写以授予公共和克隆可变结构等。如果需要,仍然允许 Object 的子类抛出 CloneNotSupportedException。 Bartek 有一个很好的后半部分答案,但是构造函数并不总是可用于多态性和泛型的情况。提到的“Effective Java”确实有更多细节
      【解决方案4】:

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

      public class  Color implements Cloneable
      {
          public String ColorName()
          {
              return "Red";
          }
      
          @Override
          public Color clone() {
              //return your cloned Color instance
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-25
        相关资源
        最近更新 更多