1

java 中的每个类都隐式扩展了 Object class.clone() 在 Object 中受到保护。受保护的方法对于子类是可见的,知道。那么为什么我们需要覆盖?即使我阅读了很多网站,我也无法理解这些概念。请解释清楚。谢谢。

4

3 回答 3

2

这是因为只有子类才能看到克隆。其他类,即使是同一个包中的类,也不会在 child 中看到 clone,因此将无法克隆 child:

class Test2 implements Cloneable {
}

public class Test1 {


    public static void main(String[] args) throws Exception {
        Test2 t2 = new Test2();
        t2.clone(); <-- compile time error: Method clone() from type Object is not visible
    }
}
于 2013-07-02T11:44:20.450 回答
1

您只需要覆盖那些需要您自己实现的超类方法。如果您想要超类的默认行为,则无需覆盖

于 2013-07-02T11:42:05.670 回答
1

让我们一步一步地克隆:

  • 虽然,每个对象都继承Object.clone(),克隆默认情况下不是ON。这意味着如果你尝试clone()一些随机对象,你可能会得到一个CloneNotSupportedException

  • 启用克隆,对象的类或其超类之一必须实现Cloneable接口。它只是一个标记接口,没有它就会抛出上面提到的异常。

  • 假设已启用克隆,则默认实现继承为protected。因此,该类仍然可以使用它来创建其对象的副本,但它还不能被公众调用。

  • 现在,如果您的类想要提供从类外部复制其对象的功能,则可以将其覆盖 Object.clone()公共并简单地super.clone()在内部调用以仍然使用默认实现。

  • 这让我想到了最后一点。默认实现是对对象进行浅拷贝,这意味着它将简单地将所有原语以及引用值复制到新对象上。这意味着,复杂的数据结构,如 aMap将被共享,因为两个副本虽然会有两个不同的引用,但它们将指向同一个Map.

    这就是为什么大多数时候覆盖必须提供自己的实现来制作(更好地称为)对象的深层副本,以便克隆不共享来自其源对象的任何状态并且可以独立修改而无需影响他人的状态。

于 2013-07-02T12:01:17.643 回答