在一本关于Core Java的书中,我发现了这段摘录:
想想的方式 对象类可以实现克隆。它 什么都不知道对象, 所以它只能逐场进行 复制。如果对象中的所有数据字段 是数字或其他基本类型, 复制字段就好了。但 如果对象包含对的引用 子对象,然后复制字段 给你另一个参考 子对象,所以原来和 克隆的对象仍然分享一些 信息。
读完之后,我想知道How is the clone method originally implemented in Object Class?
困扰我的是:Object
类中的一个方法如何通过子类对象的字段克隆来创建一个字段,而它对该类一无所知?
答案 0 :(得分:12)
实际上,clone()
是在本机代码中实现的,所以我假设它只是在不知道内容的情况下进行内存复制(复制所有字节)。
除此之外,还有Reflection API可以获得关于某个类的知识(然而,这会更慢)。
答案 1 :(得分:1)
从Javadoc:
中读取此内容protected Object clone() -
创建并返回此副本 宾语。 “复制”的确切含义 可能取决于对象的类。 一般意图是,对任何人 对象x,表达式:
x.clone()!= x
将是真的,表达式为:
x.clone()。getClass()== x.getClass()
将是真的,但事实并非如此 绝对要求。虽然它是 通常情况是: x.clone()。equals(x)将为true,这个 不是绝对的要求。通过 约定,返回的对象应该 通过调用super.clone获得。如果 一个类及其所有超类 (除了Object)遵守这个约定,
会是这样的x.clone()。getClass()== x.getClass()。
按照惯例,返回的对象 这种方法应该是独立的 这个对象(正在被克隆)。
要实现这种独立性,它 可能需要修改一个或多个 返回的对象的字段 在返回它之前超级克隆。 通常,这意味着复制任何 构成的可变对象 内部的“深层结构” 被克隆的对象并取代了 用这些对象引用 对副本的引用。如果是一个班级 仅包含原始字段或 那么引用不可变对象 通常情况下没有字段 在super.clone返回的对象中 需要修改。
意味着当你在对象中有一个子对象时,你不应该只是克隆/复制它的引用,而是该对象的内部结构(为了创建它的新实例),如果每个对象都有 clean clone()方法你可以像父对象一样克隆它,否则你将不得不创建它的新实例并逐个复制它的内部premitive字段。