当前位置: 首页 > 知识库问答 >
问题:

为什么Cloneable没有clone()?[副本]

卢雅惠
2023-03-14

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

    null

疑点:

为什么Java设计者会做出这样的设计选择并这样实现它?为什么不在cloneable本身中定义clone(),如果实现类不为clone()提供实现,那么将产生编译时错误。

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

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

共有1个答案

姬念
2023-03-14

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

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

 类似资料:
  • 问题内容: Java固有地被破坏了。具体来说,我与接口有关的最大问题是,它期望方法行为无法定义方法本身。因此,如果遍历列表,则必须使用反射来访问其定义的行为。但是,在Java 8中,我们现在有了默认方法,现在我问为什么在中没有默认方法。 我知道为什么接口不能使用默认的Object方法,但是,这是一个明确的设计决定,因此可以进行例外处理。 我有点设想过时,并将其内部代码更改为以下内容: 并且继续进行

  • 问题内容: 我正在阅读有关如何正确执行数组深拷贝的信息,但是我对如何实现数组感到困惑。它是该类的成员,但是,如果您阅读javadocs: 首先,如果此对象的类未实现Cloneable接口,则将引发CloneNotSupportedException。 那么为什么要首先定义方法呢?当然,如果仅当存在接口时才可以使用方法,则可以将方法放在接口中。该接口本身是空的; 它只是Java用来确保使用该方法合法

  • 我正在阅读如何正确执行数组的深度复制,但是我对是如何实现的感到困惑。它是类的成员,但是如果您阅读Javadocs: 首先,如果该对象的类没有实现接口Cloneable,则抛出CloneNotSupportedException。 为什么Java要这样做?我肯定他们有正当的理由,但我似乎想不通。

  • Java中的本质上是不可靠的。具体地说,我对接口的最大问题是,它需要一个不定义方法本身的方法行为。因此,如果遍历一个列表,您必须使用反射来访问它定义的行为。然而,在Java8中,我们现在有了默认方法,现在我问为什么在中没有默认的方法。 我理解为什么接口不能默认对象方法,但是,这是一个明确的设计决定,所以可以做出例外。 我有点想弃用并将其内部代码更改为类似以下内容: 然后继续使用使作为中的默认方法的

  • 在这个平台上,关于对象类的clone()方法有很多问题。每个人的回答都不一样。关于clone()为什么要受到保护,有很多问题。有人说.. null > 如果上面的第二点是正确的,那么我们如何直接访问子类中的clone()。 什么是不可克隆对象。 有什么需要重写clone()在子类中进行克隆的情况。而另一个包的受保护成员可以通过直接继承其父类在另一个包中访问。 为什么object.clone()没有

  • 我也下载了JDK,我在每个论坛上看到这个问题,都说要添加变量JDK\u HOME或JAVA\u HOME,我两个都试过了,但仍然没有打开。 我重新安装了Android Studio并重新启动了我的计算机,但它没有打开。我得到了这样的加载图标,但它只是卡在上面。 我正在运行Windows 8.1,并且安装了最新版本的JDK。非常高兴能开始编写代码,如有任何帮助或建议,将不胜感激。