java - 为什么要重写 Java 中的克隆方法

标签 java clone

我对在我想要克隆对象的类中覆盖克隆方法感到困惑。

对象类有protected object方法,并且根据 protected 行为,当一个方法被保护时,它只能被类本身、类的子类或类访问与类在同一个包中

由于 Java 中的每个类都从 Object 扩展,因此它应该具有克隆方法,但我们仍然被迫重写克隆。为什么需要它?

另外,我在一些地方读到要覆盖克隆对象并将其公开。我想知道,为什么会这样?

欢迎大家回答。

最佳答案

As every class in Java extends from Object, so it should have clone method but still we are forced to override clone

不,您不会被迫重写clone 方法。在继承中,当你继承一个类时,你不会被迫重写它的方法。它的修饰符是 public 还是 protected 并没有太大的区别。但是,如果您想直接在 super 类引用上调用方法,则该方法必须是 public。 protected 方法只能通过继承访问。也就是说,您只能通过 subclass 引用访问它们。或者,如果您覆盖该方法,则可以通过 super 关键字访问它们。

话虽如此,您不应该重写clone 方法,因为它已损坏。因为,要克隆一个类,您需要实现 Cloneable 接口(interface)。然后你的类使用 Object 类的 clone 方法。因为,Cloneable 接口(interface)没有任何克隆 的方法。改用 Copy Constructor 会是更好的选择。

public class A {
   private int data;
   public A() {
   }

   public A(A a) {
      this.data = a.data;
   }
}

有关更多详细信息,我建议阅读Joshua Bloch 的 Effective Java 的这一章,其中涵盖了使用clone 方法的所有方面。

Effective Java- Item # 11 - Override clone judiciously

关于java - 为什么要重写 Java 中的克隆方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13092128/

相关文章:

java - 使用 Velocity 与 Java 结合使用,我尝试从 '.' 分隔字符串中提取单个字段

java - 如何让2个线程共享数据? ( java )

Java迷宫打破封闭

git - 克隆裸 git 存储库的单个路径

java - 如何克隆 BufferedImage

java - PrintWriter 仅使用 println 发送字符串而不打印

java - 无法使用 .edit() 和 .apply() 来更新值

java/jackson - 链式@JsonValue 注释和反序列化

java - 为什么 CopyOnWriteArrayList 需要写入和读取操作的副本?

node.js - 将 javascript 对象分配给新对象作为副本