这个平台上有很多关于对象类的clone((方法的问题。 每个人的回答都不同。关于为什么 clone(( 受到保护有很多问题。有人说..
- clone(( 是受保护的,所以我们必须提供我们自己的 clone(( 并从中间接调用 Object.clone((。
- clone(( 受到保护,因此在 java.lang 包之外,我们可以直接在子类中访问此方法,也可以仅使用子类 Object 访问此方法。
- 不得在不可克隆的对象上调用克隆,因此不会公开克隆。
现在这是我的问题。
- 如果上面的第二点是正确的,那么我们如何直接访问子类中的clone((。
- 什么是不可克隆的对象。 在
- 克隆的情况下,需要在子类中覆盖clone((是什么。而另一个包的受保护成员,我们可以通过直接继承其父类来访问另一个包内部。
为什么 Object.clone(( 没有身体部分。
受保护的本机对象克隆((抛出克隆不支持异常;
如果上面的第二点是正确的,那么我们如何直接访问子类中的 clone((。
这是正确的。
喜欢这个:
public class Foo implements Cloneable {
public Foo copy() {
return super.clone(); // or just `clone()`
}
}
关键是类的方法可以调用其超类中的protected
方法。 请注意,如果要在java.lang.Object
中启用clone()
的默认实现,则需要implement Cloneable
Foo
。 但是您不必启用它,即使启用也不必使用它;见下文。
什么是不可克隆的对象。
它们是无法(成功(调用clone()
的对象。 确切的含义取决于上下文:
可能是没有
public
克隆方法的对象,并且您无法调用protected
方法。可能是(非公共(克隆方法不起作用;例如,因为该类不会
implement Cloneable
或扩展一个起作用的方法。
克隆的情况下,需要覆盖子类中的
clone()
。而另一个包的受保护成员,我们可以通过直接继承其父类来访问另一个包内部。
覆盖clone()
有三个不同的原因:
使
clone()
可供其他类访问,否则无法访问它。 也就是说,任何不在同一包中且不扩展此类的类。要更改
clone()
方法的行为,请执行以下操作:- 您不必打电话给
super.clone()
. 您可以根据需要实现克隆行为。 - 您可以在调用克隆后对克隆执行
super.clone()
操作。
- 您不必打电话给
重写返回类型,以便无需强制转换
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这个特定的对象需要克隆