从这篇关于克隆与复制构造函数的 Artima 文章:
Object 的 clone 方法非常棘手。它基于现场副本,并且是“语言外的”。它创建一个对象而不调用构造函数。不能保证它保留了构造函数建立的不变量。多年来,无论在 Sun 内部还是外部,都出现了很多错误,这是因为如果您只是在链上反复调用 super.clone 直到您克隆了一个对象,您就会得到该对象的浅表副本。
Joshua Bloch所说的外语是什么意思?
从这篇关于克隆与复制构造函数的 Artima 文章:
Object 的 clone 方法非常棘手。它基于现场副本,并且是“语言外的”。它创建一个对象而不调用构造函数。不能保证它保留了构造函数建立的不变量。多年来,无论在 Sun 内部还是外部,都出现了很多错误,这是因为如果您只是在链上反复调用 super.clone 直到您克隆了一个对象,您就会得到该对象的浅表副本。
Joshua Bloch所说的外语是什么意思?
他的意思是“Java 范围之外”。
特别是在 Java 中,创建新对象的“正确”方法是使用该对象的构造函数。许多类编写者在他们的构造函数中依赖这个假设和代码逻辑——比如输入验证或你想在构造时保证的任何其他东西——这就是他所说的“构造函数建立的不变量”。但是克隆绕过了这个基本约束,并在不调用构造函数的情况下创建了一个内存副本——因此它是“额外的语言”。
从技术上讲,序列化也是如此。
可能是因为它没有在 Java 中实现,但它在 Object 类中有一个本机。
语言外的对象创建机制(除了调用或链接构造函数之外的意思)是: