gpt4 book ai didi

java - 为什么 Cloneable 没有 clone()?

转载 作者:行者123 更新时间:2023-12-01 13:09:59 28 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Java: Rationale of the Cloneable interface

(5 个回答)



Why is Cloneable not deprecated?

(3 个回答)



Why does java.lang.Cloneable not override the clone() method in java.lang.Object?

(2 个回答)


2年前关闭。




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

  • 一个类实现了 Cloneable接口(interface)向 Object.clone() 方法指示该方法制作该类实例的逐个字段副本是合法的。
  • 调用 Objectclone未实现 Cloneable 的实例上的方法接口(interface)导致异常 CloneNotSupportedException被抛出。
  • 但是,请注意 Cloneable接口(interface)不包含 clone方法。因此,实现 Cloneable不负责因未实现 clone() 而引发任何错误/异常.
  • 相反,Object.clone()是 native 方法,calls JVM_Clone from jvm.cpp CloneNotSupportedExceptionthrown在这个 cpp 方法中。

  • 疑问:

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

    Q2。 为什么要检查一个实例是否实现了 Cloneable在运行时?

    Q3。 是否有任何特定理由在 native 代码中检查它?

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

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

    最佳答案

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

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

    关于java - 为什么 Cloneable 没有 clone()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60745648/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com