为什么Java中的Object类包含受保护的方法?

为什么Java中的Object类包含受保护的方法,例如clone()finalize() ,如果您使用或编写的所有类都inheritance了Object的实例方法?

如果C2类扩展C1 ,并且C1包含public方法,那么C2的方法(如果被覆盖)也必须是public ; Java在覆盖时对方法的访问施加额外限制是非法的。 如果C1包含protected方法,则C2的重写方法可能受到protectedpublic

即使C1Object类,这些规则也适用。 所以我认为原因是类(所有inheritance自Object )可以声明自己的重写clonefinalize方法,并在选择时使其protected ,而不是public

编辑:这一点的一个重要结果是clonefinalize不像公共成员那样可以自由访问。 在C2类中,您可以在所有类型的对象上使用clonefinalize ,因为它们是受保护的方法,因此可用于子类C2 。 但是你不一定能在另一个类的对象上使用它们。

 class X { } class Y { private Y field1; private X field2; public void foo() throws Exception { Object o1 = this.clone(); // legal Object o2 = field1.clone(); // legal Object o3 = field2.clone(); // illegal String s1 = field2.toString(); // legal since toString() is "public" in Object } } 

这应该表明尽管子类可以访问protected方法,但是对它们的可访问性仍有一些限制。 请注意,如果X具有@Override public Object clone()方法,则o3的声明将变为合法。

Object有两个protected方法: clone()finalize()

finalize() 不是由客户端代码调用,而是可以被子类覆盖 – 因此,它受到保护。

客户端也不打算调用Object clone() – 除非它已被子类显式覆盖并public

这样做是因为对于通用抽象Object ,如果用户想要clone它或者finalize ,则不清楚该怎么做。 这就是为什么我们有机会覆盖这些方法并创建我们自己的实现。

Object类包含带有protected modifier的finalize()和clone()方法,以便开发人员可以决定是否可以使用protected或public修饰符覆盖这些方法。完全取决于需求,我们是否允许客户端代码调用这些方法或不。