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

可以使用构造函数克隆方法创建对象

谢涵煦
2023-03-14

我一直认为,clone()创建对象时不需要调用构造函数

但是,在阅读有效Java第11条:明智地覆盖克隆时,我发现了一条声明,上面写着

“不调用构造函数”的规定太强了。行为良好的克隆方法可以调用构造函数来创建正在构建的克隆内部的对象。如果类是最终的,克隆甚至可以返回构造函数创建的对象。

谁能给我解释一下吗?

共有2个答案

朱鸿畅
2023-03-14

我认为下面的部分代码总是创建新对象并提供给其他类(即singleton中的helpfull)。

 @Override
    public Object clone() {
        return new Foo(bar);
    }

我认为这可以用于以下目的:

public MyObject clone() {
    return new MyObject(this);
}
陈项禹
2023-03-14

我一直认为clone()创建对象时不调用构造函数。

对象中的实现。clone()不调用构造函数。

没有什么可以阻止你自己以这样的方式实现它。例如,这是一个非常有效的克隆实现:

public final class Foo implements Cloneable {
    private final int bar;

    public Foo(int bar) {
        this.bar = bar;
    }

    @Override
    public Object clone() {
        return new Foo(bar);
    }
}

只有当类是final时,才能(无条件)执行此操作,因为这样可以保证返回与原始对象类型相同的对象。

如果类不是最终的,我想你可以检查实例是否“只是”覆盖clone()类型的实例,并在不同情况下以不同的方式处理它......虽然这样做很奇怪。

 类似资料:
  • 问题内容: 我一直认为无需调用构造函数即可创建对象。 但是,在 明智地 阅读《有效的Java 项目11:覆盖克隆》时 ,我发现了一条声明,指出 “没有调用构造函数”的规定太强了。行为良好的克隆方法可以调用构造函数来创建正在构建的克隆内部的对象。如果该类是最终的,则clone甚至可以返回由构造函数创建的对象。 有人可以向我解释一下吗? 问题答案: 我一直以为clone()会创建一个对象而不调用构造函

  • Javassist的API似乎允许我们创建类中声明的类初始值设定项(即静态构造函数)的精确副本: 但是,该副本还包括(公共/私有)静态最终字段。例如,以下类的静态构造函数: 事实上是: 因此,静态构造函数的精确副本也将包括对最终字段“名称”的调用。 有没有办法创建不包含对final字段的调用的静态构造函数的副本? --谢谢

  • 问题内容: 我在一个项目中使用了一个生成器类。 假设我有一个基于以下类的构建器。 我需要新的构建基于克隆,使包含所有已经存在的价值。 在我的构造函数中,我基于已设置的字段初始化一些字段(未直接设置)。 -我正在初始化这个领域。如果存在,则将设置该值或将设置。 -我也在同一构造函数中初始化此字段。 最重要的是,我在地图上放置了一些必填字段。我不确定这样做的正确方法是什么。不过,我需要补充和成图。(一

  • 这是我的复制构造函数 怎么会这样?这不像是我使用进行克隆,所以我不理解。

  • 我编写了以下代码和驱动程序,但我不知道如何使用两个构造函数创建银行账户对象。一个构造函数获取初始余额,第二个构造函数在没有钱的情况下开设账户。此外,Account tBalance是否应该包括有效性检查? 或者,我可以执行以下操作: 将费用作为描述银行账户的一部分。根据需要更新BankAccount类。用户应该能够为每个帐户设置费用金额,并通过一种方法添加费用。向驱动程序添加代码以演示费用功能。(

  • 我已经编写了一个测试应用程序,用于演示使用浅层、深层和复制构造函数的Java克隆。 我实现了浅和深,但与复制构造函数我认为我错过了一些东西。 请查看下面的代码,并让我知道复制构造函数实现的修复方法。 输出(复制构造函数) 15007 Amit Chirimiri Kripalu 15007 Amit Chirimiri ShriKrishn 编辑: 由于学生类包含嵌套类(教师)引用,简单的复制构造