Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Cloneable没有clone()?_Java - Fatal编程技术网

Java 为什么Cloneable没有clone()?

Java 为什么Cloneable没有clone()?,java,Java,我试图理解Object.clone()在Java中的工作原理。我遇到了以下事实: 类实现了Cloneable接口,以向Object.clone()方法指示该方法为该类实例的字段副本创建字段是合法的 在未实现Cloneable接口的实例上调用Object的clone方法会引发异常CloneNotSupportedException 但是,请注意,Cloneable接口不包含clone方法。因此,实现Cloneable不会因未实现clone()而引发任何错误/异常 相反,Object.clone(

我试图理解Object.clone()在Java中的工作原理。我遇到了以下事实:

  • 类实现了
    Cloneable
    接口,以向Object.clone()方法指示该方法为该类实例的字段副本创建字段是合法的
  • 在未实现
    Cloneable
    接口的实例上调用
    Object
    clone
    方法会引发异常
    CloneNotSupportedException
  • 但是,请注意,
    Cloneable
    接口不包含
    clone
    方法。因此,实现
    Cloneable
    不会因未实现
    clone()
    而引发任何错误/异常
  • 相反,
    Object.clone()
    是一个本机方法,它
    JVM\u clone
    CloneNotSupportedException
    在这个cpp方法中
怀疑:

Q1.为什么Java设计人员会做出这种设计选择并这样实现它?为什么不在
Cloneable
本身中定义
clone()
,如果实现类没有为
clone()
提供实现,则会产生编译时错误

Q2.为什么要检查实例在运行时是否实现了
Cloneable

Q3.是否有任何特定的理由在本机代码中检查它

Q4.奇怪的是
对象本身并没有实现
Cloneable
,而是提供了
clone()
的实现,这反过来检查实现
Cloneable
的类是否实现了
clone()
。理想情况下,不应该
Object
实现
Cloneable
(声明
clone()
),然后为
clone()
提供一个实现吗


PS:我知道在一个问题中问多个问题是个坏主意。但这些都是密切相关的问题。我可以很好地问一个问题,比如“为什么
Cloneable
不包含
clone()
?”但是,我觉得,为了更好地回答这个疑问,必须涵盖这个设计决策的各个微妙方面。我努力想了想,想出了可能不同的微妙方面,并明确地逐点询问,这样回答者就不会错过它们,并给出一个完整的答案。

问题是他们想提供clone()方法的默认实现,但默认方法当时并不存在,所以他们只有Object.clone和Cloneable接口来表示它可以被克隆。所以这真的只是因为它太旧了


正如另一位用户之前所说,clone方法是本机的,并且在接口中也不允许使用该修饰符。将Cloneable设置为抽象类不是一个选项,因为您将被迫扩展它,而无法扩展其他类,因为Java实际上没有多重继承。我不知道为什么克隆不仅适用于所有对象。

简单的回答是:他们很久很久以前就做出了糟糕的设计选择,而现在我们却一直被糟糕的设计所困扰。这能回答你的问题吗?因为“modifier
native
不允许”。在接口中(…和
clone
是native的…回答Q1-Q4)注意:
Object.clone()
不检查
Cloneable
类是否重写
clone()
。它不在乎。实际上,您几乎总是需要重写该方法,以便(1)公开该方法,(2)抑制永远不会抛出的无用检查异常,(3)深度克隆任何字段。但是它不是严格要求重写它,也没有被检查。还有一个疑问是为什么
对象
clone()
声明为
受保护的
?每个类都是
对象的子类
,所以它对所有类都是可见的,对吗?这是另一个糟糕的设计决策吗?你所说的“Object.clone不能真正被覆盖”是什么意思?在eclipse中,当我们试图将
clone()
添加到类中时,eclipse本身会向类中添加
@覆盖
。@anir抱歉,我会修正我的答案。我的意思是你不能自己复制对象。