当前位置: 首页 > 知识库问答 >
问题:

克隆方法是否克隆重写的方法?

秦跃
2023-03-14

如果我克隆了以下类的一个实例,并在实例化时覆盖了一个方法,克隆会有被覆盖的方法吗?我在https://docs.oracle.com/javase/7/docs/api/java/lang/Cloneable.html和https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#clone()中没有找到任何关于这种行为的内容。

public class ToBeCloned implements Cloneable{
    public int returnInt() {
        return 1;
    }
    public void printTest() {
        System.out.println("returnInt():"+returnInt()+"\nToBeCloned Original");
    }
    @Override
    public ToBeCloned clone() throws CloneNotSupportedException {
        return (ToBeCloned) super.clone();
    }
}

共有2个答案

公良同
2023-03-14

答案是肯定的,克隆将至少包含javaSE-1.8中覆盖的方法。

以下程序及其输出说明了这一点:

public class OverridingMethods {
    public static void main(final String[] args) {
        final ToBeCloned toBeCloned1 = new ToBeCloned();
        final ToBeCloned toBeCloned2 = new ToBeCloned() {
            @Override
            public int returnInt() {
                return 2;
            }
            @Override
            public void printTest() {
                System.out.println("returnInt():"+returnInt()+"\nToBeCloned Overridden");
            }
        };
        ToBeCloned toBeCloned3 = null;
        ToBeCloned toBeCloned4 = null;
        ToBeCloned toBeCloned5 = null;
        try {
            toBeCloned3 = toBeCloned1.clone();
            toBeCloned4 = toBeCloned2.clone();
            toBeCloned5 = toBeCloned4.clone();
        } catch (final CloneNotSupportedException e) {
            e.printStackTrace();
        }
        toBeCloned1.printTest();
        toBeCloned2.printTest();
        toBeCloned3.printTest();
        toBeCloned4.printTest();
        toBeCloned5.printTest();
    }
}

程序的输出如下:

returnInt():1
ToBeCloned Original
returnInt():2
ToBeCloned Overridden
returnInt():1
ToBeCloned Original
returnInt():2
ToBeCloned Overridden
returnInt():2
ToBeCloned Overridden

这证明重写的方法被保留,即使克隆已经克隆的实例。

竺国兴
2023-03-14

如果你做了类似

new ToBeCloned() { @Override...}

这只是创建子类并实例化它的一种简短方法。如果您克隆该实例,您将获得相同匿名子类的另一个实例,具有所有相同的方法。

 类似资料:
  • 问题内容: 我需要在我的没有超类的对象中实现一个深层克隆。 处理超类(即)引发的检查的最佳方法是什么? 一位同事建议我按以下方式处理: 对我来说,这似乎是一个不错的解决方案,但我想将其扔给StackOverflow社区,以查看是否有我可以提供的其他见解。 问题答案: 你绝对必须使用吗?大多数人都同意是坏的。 如果你已经阅读了我书中有关克隆的内容,尤其是你在两行之间阅读的话,你会知道我认为它clon

  • 我对在我想要克隆对象的类中重写克隆方法感到困惑。 因为Java中的每个类都是从Object扩展而来的,所以它应该有clone方法,但是我们仍然被迫重写clone。为什么要求? 另外,我在一些地方阅读了重写克隆对象并将其公之于众的内容。我想知道,为什么会这样? 欢迎提供所有答案。

  • 问题内容: 我正在尝试制作对象(包括实例)的深层副本。我一直很警惕使用它,在这里似乎并没有覆盖它,所以我只是逐字段进行复制。理想情况下,会有一个复制构造函数,我可以这样使用: 不幸的是,我在API中找不到任何这样的功能,并且一直试图找出我需要获得确切副本的字段。因此,要复制这些日历之一,您将如何做?我在这里缺少一些简单的捷径吗? 问题答案: 已覆盖正在运行的内容,请使用它。此外,它没有深层的数据层

  • 本文向大家介绍VMware虚拟机克隆的方法,包括了VMware虚拟机克隆的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了VMware虚拟机克隆的具体步骤,供大家参考,具体内容如下 一、环境 VMware 14 克隆系统CentOS6.8 二、开始克隆 被克隆系统处于关机状态,选择 虚拟机 > 管理 > 克隆 > 下一步 > 下一步(选择从当前状态虚拟机克隆或已有快照克隆)> 创

  • 问题内容: 有没有不使用子进程来克隆git存储库的Python方法吗?我准备使用您推荐的任何种类的模块。 问题答案: 有GitPython。之前和内部都没有听说过,它依赖于git可执行文件的位置。此外,他们可能有很多错误。但这可能值得一试。 如何克隆: (这不是很好,我不知道这是否是受支持的方法,但确实有效。)

  • 如何用clone()方法克隆Java对象 我有一个关于在java中正确实现类的方法的问题。我知道这是不好的做法,但我需要在考试中知道这一点…在上面的讨论中,他们说调用-但我不明白如果超级函数没有实现克隆会发生什么。例如,假设我有一个扩展Y的类X。X实现了Cl的,而Y没有。Y的方法应该抛出一个异常。那么在这种情况下我们该怎么办? 我能找到的所有解释都以某种方式假设所有超类都实现了克隆,或者至少我是这