为什么Java中的Object类包含受保护的方法?
为什么Java中的Object类包含受保护的方法,例如clone()
和finalize()
,如果您使用或编写的所有类都inheritance了Object的实例方法?
如果C2
类扩展C1
,并且C1
包含public
方法,那么C2
的方法(如果被覆盖)也必须是public
; Java在覆盖时对方法的访问施加额外限制是非法的。 如果C1
包含protected
方法,则C2
的重写方法可能受到protected
或public
。
即使C1
是Object
类,这些规则也适用。 所以我认为原因是类(所有inheritance自Object
)可以声明自己的重写clone
并finalize
方法,并在选择时使其protected
,而不是public
。
编辑:这一点的一个重要结果是clone
和finalize
不像公共成员那样可以自由访问。 在C2
类中,您可以在所有类型的对象上使用clone
和finalize
,因为它们是受保护的方法,因此可用于子类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修饰符覆盖这些方法。完全取决于需求,我们是否允许客户端代码调用这些方法或不。