[英]Why doesn't the java.lang.Object class clone() method have a body?
这个平台上有很多关于 Object class 的 clone() 方法的问题。 每个人的回答都不一样。 关于为什么 clone() 受到保护有很多问题。 有人说..
- clone() 是受保护的,所以我们必须提供自己的 clone() 并从中间接调用 Object.clone() 。
- clone() 在 java.lang package 之外受到保护,我们可以直接在子类中访问此方法,也可以仅使用子类 Object 访问此方法。
- 不能在不可克隆的对象上调用 clone,因此它不会被公开。
现在这是我的问题。
为什么 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()
有三个不同的原因:
使其他无法访问它的类可以访问clone()
。 也就是说,任何不在同一个 package 中并且不扩展此 class 的类。
要更改clone()
方法的行为:
super.clone()
。 您可以随心所欲地实现克隆行为。super.clone()
之后对克隆做一些事情。 覆盖返回类型,这样您就不需要转换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.