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

为什么java.lang.Object类clone()方法没有主体?

司空元凯
2023-03-14

在这个平台上,关于对象类的clone()方法有很多问题。每个人的回答都不一样。关于clone()为什么要受到保护,有很多问题。有人说..

    null

>

  • 如果上面的第二点是正确的,那么我们如何直接访问子类中的clone()。
  • 什么是不可克隆对象。
  • 有什么需要重写clone()在子类中进行克隆的情况。而另一个包的受保护成员可以通过直接继承其父类在另一个包中访问。
  • 为什么object.clone()没有身体部分。

    受保护的本机对象clone()抛出CloneNotSupportedException;

  • 共有1个答案

    长孙阳嘉
    2023-03-14

    如果上面的第二点是正确的,那么我们如何直接访问子类中的clone()。

    它是正确的。

    像这样:

    public class Foo implements Cloneable {  
        public Foo copy() {
            return super.clone();  // or just `clone()`
        }
    }
    

    关键是类的方法可以调用其超类中的protected方法。请注意,如果要在java.lang.object中启用clone()的默认实现,foo需要实现cloneable。但你不必启用它,即使启用了也不必使用它;见下文。

    它们是不能(成功地)调用clone()对象。确切的含义取决于上下文:

    >

  • 可能是没有public的对象克隆方法,而您不能调用protected方法。

    可能是(非公开的)克隆方法不起作用;例如,因为类不实现可克隆的或扩展可克隆的类。

    >

  • 使clone()可访问其他无法访问它的类。即不在同一个包中且不扩展该类的任何类。

    要更改clone()方法的行为:

    • 不必调用super.clone()。您可以任意实现克隆行为。
    • 您可以在调用super.clone().
    • 后对克隆执行某些操作

    您注意到本机修饰符了吗?本机方法没有正文。

    java.lang.object的克隆行为是在本机代码中实现的。它正在做普通Java代码无法做的事情。(或者使用Java反射。)

  •  类似资料:
    • 问题内容: 定义为的受保护的具体原因是什么? 问题答案: 克隆受到保护的事实非常令人怀疑-事实是该clone方法未在Cloneable接口中声明。 它使该方法对于获取数据副本非常无用,因为你不能说: 我认为,Cloneable现在的设计在很大程度上被认为是一个错误(以下引用)。我通常希望能够实现接口的实现,Cloneable但不一定要实现接口Cloneable(类似于的使用Serializable

    • 我试图理解object.clone()在Java中是如何工作的。我偶然发现了以下事实: null 疑点: 为什么Java设计者会做出这样的设计选择并这样实现它?为什么不在本身中定义,如果实现类不为提供实现,那么将产生编译时错误。 Q2.为什么要在运行时检查实例是否实现? 附:我知道在一个问题中问多个问题是一个坏主意。但这些都是密切相关的问题。我可以问一个问题,比如“为什么不包含?”但是,我觉得,为

    • 问题内容: 这确实是一个好奇心,而不是一个问题。 为什么类没有方法?现在看来似乎应该当你认为它有一个事实,,等方法。 我知道您可以执行以下操作: 但是为什么没有方法呢? 问题答案: 原因是Scanner类旨在读取以空格分隔的令牌。这是包装基础输入流的便捷类。在扫描仪之前,您所能做的只是读取单个字节,如果要读取单词或行,这将是一个很大的麻烦。使用Scanner,您可以传入System.in,它会执行

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

    • 问题内容: Iterables提供了两种方法 但只有一个 是否存在任何破坏对称性的设计/实现原因? 问题答案: 我认为要点是,没有理由可以使用来完成此操作。Guava尽力使API保持较小,因此没有添加可以/应该以其他方式轻松完成的事情。 另一方面,还没有一种机制可以测试iterable是否为空,如果是,则返回默认值而不是第一个值。因此,。 同样,没有简单的方法来获取最后一个元素,因此和

    • 问题内容: 虽然有一种方法没有。这是为什么?文件在完成后会自动关闭吗? 谢谢! 问题答案: 该类的javadoc将类描述为: 文件和目录路径名的抽象表示。 只是路径名的一种表示形式,有一些关于文件系统(如)和目录处理的方法,但是实际的流输入和输出在其他地方完成。流可以打开和关闭,文件不能。 (我个人的看法是,不幸的是Sun后来继续创建,给命名不一致带来了很大的困惑。)