gpt4 book ai didi

java - 为什么 Object.clone() 在 Java 中是原生的?

转载 作者:搜寻专家 更新时间:2023-10-30 19:59:18 24 4
gpt4 key购买 nike

clone Object 上的方法创建对象的精确副本,声明为:

protected native Object clone() throws CloneNotSupportedException;

为什么是native

最佳答案

基本上,因为 clone() 方法做了一些您在 Java 语言中做不到的事情:它克隆了对象的状态,包括它的实际类名称。

Java 中的克隆机制基于每个类调用父类(super class)的clone 方法,一直到Object。 Object 然后使用这个“神奇的” native clone 方法复制原始对象,包括它的实际类。

想想这个:

class A implements Cloneable {

public A clone() {

A obj = (A) super.clone();

// Do some deep-copying of fields

return obj;
}

}

class B extends A {

public B clone() {

B obj = (B) super.clone();

// Do some deep-copying of fields not known to A

return obj;

}
}

现在假设您有一个 B 类型的对象,您对它调用了 clone。您希望获得一个 B 对象,其类在内部被识别为 B,而不是 ObjectB不知道A中所有的实现,因此需要调用Aclone方法。但是,如果 A 在 Java 语言中实现了 clone 而不是调用 super.clone(),那么它返回的对象必须是 A。它不能使用 new B()(假设创建 A 时不知道 B)。

它可以用反射做一些事情,但它如何知道调用哪个构造函数以便正确填充所有最终字段?

所以诀窍是 A 不自己做,它调用 super.clone(),这一直回到 Object ,它使用一个本地方法逐字节复制原始对象,调整新的堆位置。因此,新对象神奇地变成了 B 对象,并且类型转换不会失败。

那为什么不返回一个对象呢?因为那不会是克隆。当您调用 clone 时,您希望获得具有相同状态(字段)和相同(覆盖和添加的方法)的对象。如果它返回一个内部类指定为 Object 的对象,您将只能访问 Object 提供的内容,例如 toString() ,您将无法从另一个 B 对象访问其私有(private)字段,或将其分配给 B 类型变量。

关于java - 为什么 Object.clone() 在 Java 中是原生的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27224577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com