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

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

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

  1. clone() is protected, so we have to provide our own clone() and indirectly call Object.clone() from it.
  2. clone() is protected soo outside to java.lang package we can access this method in subclass directly or with subclass Object only.
  3. clone must not be called on non-cloneable objects, therefore it is not made public.

下面是我的问题。

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

    受保护的原生对象 clone() 抛出 CloneNotSupportedException;

If the above 2nd point is correct then how we can access clone() in subclass directly.

正确。

像这样:

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

重点是class的一个方法可以调用其superclass中的protected个方法。请注意,如果您想 启用 java.lang.Objectclone() 的默认实现,则 Foo 需要 implement Cloneable。但是你不必启用它,即使启用了你也不必使用它;见下文。

What are non cloneable objects.

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

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

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

What is the need to override clone() in subclass in case of cloning. Whereas the protected member of another package we can access inside another package by inheriting its parent class directly.

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

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

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

    • 您不必致电 super.clone()。您可以随心所欲地实施克隆行为。
    • 您可以在调用 super.clone() 后对克隆体进行操作。
  3. 覆盖 return 类型,这样您就不需要转换 clone() 的结果。 (Object::clone 的 return 类型是 Object。)

Why Object.clone() doesn't have body part.

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

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

 protected native Object clone() throws CloneNotSupportedException;

这是Object中clone方法的原型class

为什么没有正文?

它是一个本地方法,所以它没有主体,因为它的主体是由本地库提供的,该库是用与 JVM 相同的 C 语言编写的 或者我们可以说我们只需要向我们需要克隆的 jvm 发出指令,其余的由 Jvm 处理

为什么保护为什么不保护public?

现在 clone() 方法被保护而不是 public 所以我们不能克隆对象 class 对象

这种行为提供给子 classes 或用户创建的 classes 。我们知道受保护的成员可以在包内的外部访问 仅 Subclass 且仅在 subclass 对象上。

为什么要覆盖?

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

public Object clone() throws CloneNotSupportedException;

为什么对象需要可克隆?

由于克隆对象是由 Jvm 完成的,因此 jvm 需要有关需要克隆哪个对象以及该对象需要具有可克隆签名的信息, 为此,我们需要实现可克隆接口,这是一个标记接口,它会通知 jvm 这个特定对象需要克隆