java - 在 Java 中克隆对象 [3 个问题]

标签 java class abstract-class clone

这样做会调用Asub的clone方法吗?或者Asub深度克隆是否正确?如果没有的话,有没有办法通过这种方法来深度克隆Asub?

abstract class Top extends TopMost {
    protected Object clone() {
        Object obj = super.clone();
        // deep copy and try catch
    }


}

abstract class A extends Top { 
    protected Object clone() {
        Object obj = super.clone();
       // deep copy and try catch
    } 


}

class Asub extends A {
    protected Object clone() {
        Object obj = super.clone();
        // deep copy and try catch
    }

    public void doSomethingNew() {
    }
}

abstract class TopMost {
    public void someMethod() {
        Top a = (Top) super.clone();
        // more code here
    }
}

public class Main {
    public static void main(String... args) {
        Asub class1 = new Asub();
        class1.someMethod();
    }
}

最佳答案

首先,请注意 the clone() interface is broken ,因此不应在新代码中使用。最好实现复制构造函数

但是,如果您确实需要这样做,正确的方法是让TopMost实现Cloneable。为什么? 《Effective Java》第二版第 11 条说道:

So what does Cloneable do, given that it contains no methods? It determines the behavior of Object’s protected clone implementation: if a class implements Cloneable, Object’s clone method returns a field-by-field copy of the object; otherwise it throws CloneNotSupportedException.This is a highly atypical use of interfaces and not one to be emulated. Normally, implementing an interface says something about what a class can do for its clients. In the case of Cloneable, it modifies the behavior of a protected method on a superclass.

此外,Asub.clone 应声明为public,而不是protected - 否则您无法从外部世界调用它。另外,如果您使用的是 Java5 或更高版本,则 Asub.clone 返回 Asub 而不是 Object 是合法且可取的(对于它的父类(super class))。

您不会在类中显示任何成员 - 各个类中的 clone 实现可能会有很大不同,具体取决于该类中成员的类型。也就是说,如果一个类有任何可变成员,您需要仔细地深度复制所有这些成员,否则您最终会得到共享其内部状态的不同对象。

但是,假设您的类只有原始字段或不可变字段,则克隆会按预期工作,尽管您的抽象类中有很多不必要的 clone 方法,所有这些方法都只需调用 super.clone() - 仅使用 Asub.clone() 可能会更好。

顺便说一句,如果 Top a = (Top) super.clone() 没有拼写错误,那么您就引入了从基类到派生类的依赖关系,这不是一个好主意。

关于java - 在 Java 中克隆对象 [3 个问题],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3652748/

相关文章:

java - 仅仅为了分层结构而拥有抽象类是否有意义?

java - 我们如何确保在不可变对象(immutable对象)中定义的 ArrayList 的不可变性?

Scala 的密封抽象与抽象类

java - 缩放和旋转点数组

c++ - 来自类的访问列表,在父类中

java - 如何调用不同类中的 public static void 。

java - 抽象类和接口(interface)会发生什么变化

c# - 关于抽象类?

java - 中断的 Java 线程真的可以跳过 finally 子句吗?

java - 如何访问 servlet 上下文监听器内的属性?