【问题标题】:Why cant we use clone method in class without implementing clonable as even though base class object has "clone()" method? [duplicate]为什么我们不能在类中使用克隆方法而不实现可克隆,即使基类对象具有“clone()”方法? [复制]
【发布时间】:2018-04-28 05:24:01
【问题描述】:

我试图覆盖我的类“Employee”中的克隆方法,当调用 super.clone() 时,它给出了异常,但当我实现“可克隆”时,相同的代码工作。我的问题是,每个类都有基类“对象”。但是当我们调用 super.clone() 时它会失败并且在实现可克隆时它会起作用。为什么会这样?

不应该使用子类中的“super”来访问基类方法吗?为什么会抛出运行时异常?

public class Employee {
    //explicit Employee extends Object didn't worked. 
    String name;
    Integer id;
    public Employee(String name, Integer id) {
       this.name = name;
       this.id = id;
     }
    @Override
    protected Object clone() throws CloneNotSupportedException {
      return super.clone();
    }
  }

【问题讨论】:

  • 提示:我们如何知道 Employee 可以被克隆?
  • 这就是语言的设计方式。如果语言设计者要回答你的问题,那对你有什么帮助?这就像问一个特定的关键字为什么具有特定的含义……之所以如此,是因为它是这样定义的。
  • 如果Obejct类没有按照文档实现clone()方法,那么Employee类中的'suer.clone()'是什么意思?

标签: java object clone


【解决方案1】:

查看stackoverflow answer:

Object 中 clone() 的实现检查是否是实际的类 实现 Cloneable,并创建该实际类的实例。

所以如果你想让你的类可以克隆,你必须实现 可克隆并将 super.clone() 的结果向下转换到您的班级。 另一个负担是对 super.clone() 的调用可能会抛出一个 您必须捕获的 CloneNotSupportedException,即使您 知道它不会发生(因为你的类实现了 Cloneable)。

Object 类的 Cloneable 接口和 clone 方法是 一个明显的面向对象设计出错的案例。

【讨论】:

  • 这个答案只不过是对另一个 SO 问题的引用。相反,您应该投票以关闭此问题作为重复问题。
【解决方案2】:

要回答您的问题,只需查看Object class reference page,您就会看到:

The class Object does not itself implement the interface Cloneable, so calling the clone method on an object whose class is Object will result in throwing an exception at run time.

所以你描述的行为正是Java定义的。不知道这里还有什么令人困惑的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    相关资源
    最近更新 更多