Object类如何实现clone()方法

问题描述 投票:0回答:2

在一本关于 Core Java 的书中,我发现了这段摘录:

思考一下 对象类可以实现克隆。它 对物体一无所知, 所以它只能逐个字段 复制。如果对象中的所有数据字段 是数字或其他基本类型, 复制字段就可以了。但 如果该对象包含对 子对象,然后复制字段 给你另一个参考 子对象,所以原来的和 克隆对象仍然共享一些 信息。

读完这篇文章后我想知道,

How is the clone method originally implemented in Object Class?

令我困扰的是:

Object
类中的方法如何在对子类对象一无所知的情况下逐个字段克隆子类对象?

java class object clone
2个回答
12
投票

实际上,

clone()
是在本机代码中实现的,所以我假设它只是进行内存复制(复制所有字节)而不知道内容。

除此之外,还有 Reflection API 来获取有关类的知识(但是速度会更慢)。


1
投票

Javadoc 阅读此内容:

受保护对象克隆() -

创建并返回此副本 目的。 “复制”的准确含义 可能取决于对象的类。 一般意图是,对于任何 对象 x,表达式:

x.clone() != x

为真,并且表达式:

x.clone().getClass() == x.getClass()

是真的,但这些都不是 绝对的要求。虽然它是 通常情况是: x.clone().equals(x) 将为 true,这 不是绝对要求。经过 约定,返回的对象应该 通过调用super.clone获取。如果 一个类及其所有超类 (对象除外)遵守此约定, 将会是这样的情况

x.clone().getClass() == x.getClass().

按照约定,返回的对象 这个方法应该独立于 这个对象(正在被克隆)。

为了实现这种独立性,它 可能需要修改一项或多项 返回对象的字段 在返回之前进行 super.clone 。 通常,这意味着复制任何 可变对象包括 内部“深层结构” 对象被克隆并替换 对这些对象的引用 对副本的引用。如果一个班 仅包含原始字段或 对不可变对象的引用,然后 通常是没有字段的情况 在 super.clone 返回的对象中 需要修改。

意味着当你的对象中有一个子对象时,你不应该只克隆/复制它的引用,而应该克隆/复制该对象的内部结构(为了创建它的新实例),如果每个对象都有它的 cleanclone() 方法将能够像父对象一样克隆它,否则您将必须创建它的新实例并一一复制其内部前提字段。

© www.soinside.com 2019 - 2024. All rights reserved.