为什么我们不能在类中使用clone方法而不实现clonable,即使基类对象有“clone()”方法?

时间:2017-11-15 05:06:55

标签: java object clone

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

喜欢不应该使用子类中的“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();
    }
  }

2 个答案:

答案 0 :(得分:1)

查看stackoverflow answer

  

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

     

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

     

Object类上的Cloneable接口和clone方法是   面向对象设计的一个明显例子出了问题。

答案 1 :(得分:0)

要回答您的问题,请查看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的定义。不知道还有什么令人困惑的。