首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Cloneable没有克隆()?

为什么Cloneable没有克隆()?
EN

Stack Overflow用户
提问于 2020-03-18 18:40:10
回答 1查看 880关注 0票数 4

我试图了解Object.clone()是如何在Java中工作的。我发现了以下事实:

  • 类实现Cloneable接口,以向Object.clone()方法表明该方法对该类实例的字段对字段副本是合法的。
  • 在不实现Object接口的实例上调用Cloneableclone方法将导致抛出异常CloneNotSupportedException
  • 但是,请注意,Cloneable接口不包含clone方法。因此,实现Cloneable不负责为不实现clone()而引发任何错误/异常。
  • 相反,Object.clone()是本机方法,在此cpp方法中,呼叫 JVM_Clone jvm.cppCloneNotSupportedException抛出

怀疑:

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

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

Q3.有什么特定的理由在本机代码中检查它吗?

Q4.奇怪的是,Object本身没有实现Cloneable,但是提供了clone()的实现,这反过来检查是否有实现Cloneable的类实现clone()Object不应该理想地实现Cloneable (声明clone()),然后为clone()提供一个实现

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

EN

回答 1

Stack Overflow用户

发布于 2020-03-18 18:58:46

问题是,他们希望提供克隆()方法的默认实现,但当时不存在默认方法,因此他们只有Object.clone和Cloneable接口来表示可以克隆它。所以这只是因为它很古老。

正如另一位用户之前所说的,克隆方法是原生的,接口中也不允许使用该修饰符。使Cloneable成为抽象类不是一种选择,因为您将被迫扩展它,并且无法扩展其他类,因为Java实际上并不具有多重继承。为什么克隆不只是支持所有的对象,我不知道。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60745648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档