【问题标题】:How does Object class implement clone() methodObject类如何实现clone()方法
【发布时间】:2011-03-21 08:29:37
【问题描述】:

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

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

读完后我想知道How is the clone method originally implemented in Object Class?

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

【问题讨论】:

    标签: java class object clone core


    【解决方案1】:

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

    除此之外,还有反射 API 可以获取有关类的知识(不过会慢一些)。

    【讨论】:

    • 好吧,我不知道反射,我的意思是通过反射进行克隆似乎是一个非常艰苦的想法 - 我的意思是考虑制作所有这些 Method、Field 对象并调用所有这些 getClass() .. .eekkksss ...听起来很冗长乏味。但是,我会购买您关于 clone() 是本机方法的论点。因为,在 JLS 的规范下,不可能在 Object 中定义 clone() 以便能够访问所有不存在的类的字段。 ---- AViD
    • 在本机代码中,对另一个对象的任何引用都是指针,因此如果您使用默认实现clone() 一个对象,则复制的只是指针。因此克隆的对象仍然引用原始指向的对象。原始字段(如int 等)直接存储在对象中(即没有指针),因此它们将被复制。
    • 对。它确实:VMMemoryManager.clone(this);
    • @O.D.不过取决于实现,在 Windows JDK 1.5 中它只是protected native Object clone() throws CloneNotSupportedException;。但结果是一样的;)
    • @VaidAbhishek:它不需要反射,只需要按位复制。 memcpy() 例如。您关于不存在的课程的最后一句话没有意义。你不能对不存在的类做任何事情。
    【解决方案2】:

    Javadoc阅读这篇文章:

    受保护的对象 clone() -

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

    x.clone() != x

    将是真的,那表达式:

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

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

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

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

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

    意味着当您的对象中有一个子对象时,如果每个对象都有其 clean em> clone() 方法,您将能够像父对象一样克隆它,否则您将不得不创建它的新实例并一一复制其内部预置字段。

    【讨论】:

    • 这一切都很好,关于 clone() 方法的完美配方的智慧,但我想知道 clone() 是如何在 Object 类中实现的......你对此一无所知...... . :-(
    • 看看这个clone方法的源码:docjar.com/html/api/java/lang/Object.java.html
    猜你喜欢
    • 2012-07-06
    • 1970-01-01
    • 2010-10-27
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多