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

Java 克隆方法可以使用构造函数创建对象吗,java,clone,Java,Clone,我一直认为clone()在不调用构造函数的情况下创建对象 但是,在阅读有效的Java第11项:明智地覆盖克隆时,我发现了一条语句 “不调用构造函数”的规定太强。A. 行为良好的克隆方法可以调用构造函数来创建对象 正在构建的克隆的内部。如果类是final,则克隆 甚至可以返回由构造函数创建的对象 有人能给我解释一下吗 我一直认为clone()创建对象时不调用构造函数 Object.clone()中的实现不调用构造函数 没有什么可以阻止你自己以一种可以实现的方式来实现它。例如,这是一个非常有效的cl

我一直认为
clone()
在不调用构造函数的情况下创建对象

但是,在阅读有效的Java第11项:明智地覆盖克隆时,我发现了一条语句

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

有人能给我解释一下吗

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

Object.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
时,才能(无条件)执行此操作,因为这样可以保证返回与原始对象类型相同的对象


如果类不是final,我想您可以检查该实例是否“只是”重写
clone()
类型的实例,并在不同情况下对其进行不同的处理。。。但是这样做会很奇怪。

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

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

public MyObject clone() {
    return new MyObject(this);
}

为什么只有在期末考试时我才能这样做?如果在非final类中执行此操作,会有任何影响吗?@Anand:
clone()
必须返回与原始类相同类型的实例。如果类是非最终的,则必须考虑代码< > 将引用子类的实例的可能性。<代码>克隆()/<代码>方法不调用构造函数,它的默认行为是执行浅拷贝。但如果我们想执行深度复制,我们需要重写
clone()
方法,从中我们可以返回新对象。
public MyObject clone() {
    return new MyObject(this);
}