为什么Cloneable没有clone()? [复制]

2023-12-21

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

  • 一个类实现了Cloneable接口,向 Object.clone() 方法指示该方法对该类的实例进行逐字段复制是合法的。
  • 调用Object's clone未实现的实例上的方法Cloneable接口导致异常CloneNotSupportedException被抛出。
  • 但请注意,Cloneable接口不包含clone方法。因此,实施Cloneable不负责因未实施而引发任何错误/异常clone().
  • 反而,Object.clone()是一个本机方法,其中calls https://github.com/bpupadhyaya/openjdk-8/blob/45af329463a45955ea2759b89cb0ebfe40570c3f/jdk/src/share/native/java/lang/Object.c#L47 JVM_Clone from jvm.cpp https://github.com/openjdk-mirror/jdk7u-hotspot/blob/50bdefc3afe944ca74c3093e7448d6b889cd20d1/src/share/vm/prims/jvm.cpp#L545 and CloneNotSupportedException is thrown https://github.com/openjdk-mirror/jdk7u-hotspot/blob/50bdefc3afe944ca74c3093e7448d6b889cd20d1/src/share/vm/prims/jvm.cpp#L566在这个cpp方法中。

Doubts:

Q1.为什么Java设计者会做出这样的设计选择并这样实现呢?为什么没有clone()定义于Cloneable如果实现类没有提供实现,它本身会给出编译时错误clone().

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

Q3.有什么具体原因要在本机代码中检查它吗?

Q4.奇怪的是Object本身并没有实现Cloneable,但提供了一个实现clone(),这又检查是否有任何类实现Cloneable实施clone()或不。理想情况下不应该Object实施Cloneable(声明clone()),然后提供一个实现clone()?

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


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么Cloneable没有clone()? [复制] 的相关文章

随机推荐

  • setInterval延迟不准确

    我目前正在使用 setInterval 创建倒计时 尽管目前它的运行速度比应有的慢 根据MDN https developer mozilla org en docs Web API window setInterval 延迟参数以毫秒为单
  • 无法使用 smack 连接 XMPP 服务器:实施基于 GCM XMPP 的应用程序服务器时出现 EOF 异常

    java io EOFException no more data available expected end tag to close start tag
  • 从图像中删除白色背景并使其透明

    我们正在尝试在 Mathematica 中执行以下操作 RMagick 从图像中删除白色背景并使其透明 https stackoverflow com questions 7738437 但对于实际照片来说 它最终看起来很糟糕 就像图像周围
  • 字典迭代——对于 dict 与 dict.items()

    当我们迭代下面的字典时 每次迭代都会 正确地 返回一个键值对 for key value in dict items print s key has the value s key value some key 键有值 some value
  • SDL 中的 Blit 是什么?

    在 SDL wiki 中它说 使用此函数可以执行从源表面到目标表面的快速 blit 但这对我没有多大帮助 在这种情况下 术语 表面位块传输 是什么意思 基本上 这意味着将图像从一个表面复制到另一个表面 可能会被裁剪和移动
  • 二分查找和使用前缀树哪个查找更快?

    假设我有一个字符串列表和这些字符串的前缀树 并且我想在给定键的情况下定位一个字符串 哪个更快 二分查找还是前缀树查找 为什么以及时间复杂度是多少 Thanks 这两种技术都有其优点和缺点 后缀树 Advantages O N 构建复杂度 O
  • mac 上 python 子进程中的 pdflatex

    我正在尝试在 Python 2 4 4 的 tex 文件上运行 pdflatex 子进程 在 Mac 上 import subprocess subprocess Popen pdflatex fullpathtotexfile shell
  • Go 指针、引用、解除引用的规则:

    我是 GoLang 的新手 来自 Delphi C 世界 不可否认 我对这种语言感到非常兴奋 我认为它注定会成为 下一件大事 我试图了解 Go 解析器和编译器如何处理指针和引用 似乎找不到任何制定明确规则的地方 例如 在下面的代码示例中 返
  • 默认值 Specflow 步骤定义

    我刚开始接触 SpecFlow 的世界 并且遇到了第一个问题 在保持代码干燥方面 我想执行以下操作 有两种情况 Given I am on a product page And myfield equals todays date Then
  • 旋转 - 使用 LINQ C# 转置 List>

    我有一个List
  • LINQ查询任何属性包含字符串[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何查询类型 T 的集合 以返回 T 的所有项目 其中 T 的任何属性包含某个字符串 EDIT 假设我在检查是否包含之前将每个属性转换为字
  • 在 iPad 上捕获 DOM/HTML/BODY 上的 Click 事件

    我使用 jQuery 来检测 DOM 上的点击 或者让我们检测每次点击 document click function alert Click 除了 iPad iPhone 版 Safari 之外 该功能在所有浏览器中都表现良好 我还尝试在
  • 阅读 R 的电子邮件附件

    我正在使用 R 读取 Outlook 附件 我的参考资料在这里 使用 R 从 Outlook 电子邮件下载附件 https stackoverflow com questions 45577698 download attachment f
  • 以编程方式更改 WPF 中的按钮图标

    我目前有一个按钮 上面有一个图标 图像 我已经在 XAML 中配置了按钮和图像
  • 为什么静态构造函数没有任何参数?

    根据 MSDN 静态构造函数不采用访问修饰符或具有参数 在创建第一个实例或引用任何静态成员之前 会自动调用静态构造函数来初始化类 静态构造函数不能直接调用 谁能解释一下为什么静态构造函数不能有参数 正如 MSDN 所说 在创建第一个实例之前
  • 存储库模式与 DAL

    它们是一样的吗 刚刚看完罗布 康纳利的店面教程 https www asp net mvc videos mvc 1 aspnet mvc storefront aspnet mvc storefront part 1 architectu
  • 自定义集合在编辑时使 DataGrid 崩溃

    我目前正在尝试将 DataGrid ItemsSource 绑定到自定义 RowCollection 它实现 IList 和 INotifyCollectionChanged Public Class RowCollection of T
  • HTML 和 CSS:如何设置 HR 标签的样式以嵌入标题

    我正在尝试创建一个遵循以下模型的 HR
  • 如何在flutter应用程序中获取JSON数据?

    我从服务器获取了以下 JSON 数据 我需要在 pageviewbuilder 以及 flutter 应用程序中的 listview builder 中获取和配置这些数据 列表视图构建器 垂直滚动 嵌套在页面视图构建器 水平滚动 中 我已经
  • 为什么Cloneable没有clone()? [复制]

    这个问题在这里已经有答案了 我试图了解 Object clone 在 Java 中是如何工作的 我发现了以下事实 一个类实现了Cloneable接口 向 Object clone 方法指示该方法对该类的实例进行逐字段复制是合法的 调用Obj