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



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

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

现在这是我的问题。

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

    受保护的本机对象克隆((抛出克隆不支持异常;

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

这是正确的。

喜欢这个:

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

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

什么是不可克隆的对象。

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

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

  • 可能是(非公共(克隆方法不起作用;例如,因为该类不会implement Cloneable或扩展一个起作用的方法。

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

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

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

  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;

这是对象类中克隆方法的原型

为什么没有身体?

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

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

现在 clone(( 方法被指定为受保护的而不是公共的,因此我们无法克隆对象类对象

此行为提供给子类或用户创建的类。而且我们知道受保护的成员可以在包内部的外部访问 仅限子类和仅子类对象。

为什么要覆盖?

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

public Object clone() throws CloneNotSupportedException;

为什么对象需要可克隆?

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

最新更新