繁体   English   中英

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

[英]Why doesn't the java.lang.Object class clone() method have a body?

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

  1. clone() 是受保护的,所以我们必须提供自己的 clone() 并从中间接调用 Object.clone() 。
  2. clone() 在 java.lang package 之外受到保护,我们可以直接在子类中访问此方法,也可以仅使用子类 Object 访问此方法。
  3. 不能在不可克隆的对象上调用 clone,因此它不会被公开。

现在这是我的问题。

  1. 如果上述第二点是正确的,那么我们如何直接访问子类中的 clone()
  2. 什么是不可克隆对象
  3. 在克隆的情况下需要在子类中覆盖克隆()。 而另一个 package 的受保护成员我们可以通过直接继承其父 class 来访问另一个 package 内部。
  4. 为什么 Object.clone() 没有正文部分。

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

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

它是正确的。

像这样:

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

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

什么是不可克隆的对象。

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

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

  • 可能是(非公开)克隆方法不起作用; 例如,因为 class 没有implement Cloneable或扩展一个。

在克隆的情况下,需要在子类中覆盖clone() 而另一个 package 的受保护成员我们可以通过直接继承其父 class 来访问另一个 package 内部。

覆盖clone()有三个不同的原因:

  1. 使其他无法访问它的类可以访问clone() 也就是说,任何不在同一个 package 中并且不扩展此 class 的类。

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

    • 您不必调用super.clone() 您可以随心所欲地实现克隆行为。
    • 你可以在调用super.clone()之后对克隆做一些事情。
  3. 覆盖返回类型,这样您就不需要转换clone()的结果。 Object::clone的返回类型是Object 。)

为什么 Object.clone() 没有正文部分。

你注意到native修饰符了吗? 本机方法没有主体。

java.lang.Object的克隆行为是在本机代码中实现的。 是做普通Java代码做不到的事情。 (或者使用 Java 反射,就此而言。)

 protected native Object clone() throws CloneNotSupportedException;

这是Object class中克隆方法的原型

为什么没有身体?

它是一种本机方法,因此它没有主体,因为它的主体由本机库提供,该库是用 c 语言编写的,与 Jvm 相同,或者我们可以说我们只需要向 Z6CE80D8EF00F5E98FZEEEE941 的克隆提供指令即可rest 由 Jvm 负责

为什么保护为什么不公开?

现在 clone() 方法被指定为受保护的非公共方法,因此我们无法克隆 Object class object

这种行为提供给子类或用户创建的类。我们知道受保护的成员只能在子类内部的 package 之外访问,并且只能在子类 object 上访问。

为什么要覆盖?

我们在子类中覆盖它,因为有可能我们需要在 class 之外调用克隆方法,并且由于受保护的行为我们将无法做到这一点,所以我们用公共修饰符覆盖它......下面提到的原型

public Object clone() throws CloneNotSupportedException;

为什么 object 需要可克隆?

Since the cloning object is done by Jvm so there jvm need a information like on which object cloning is required and for that object is required to have cloneable signature, And for that we need to implement cloneable interface which is a marker interface and it will inform到 jvm 这个特定的 object 需要克隆

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM