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

时间:2014-04-15 23:25:38

标签: java oop object inheritance protected

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

4 个答案:

答案 0 :(得分:5)

protected中有两种Object方法:clone()finalize()

finalize() 旨在由客户端代码调用,但可能被子类覆盖 - 因此,它受到保护。

clone()的{​​{1}}不打算由客户端调用 - 除非它已被子类显式覆盖并生成Object

答案 1 :(得分:5)

如果类C2扩展C1,而C1包含public方法,则C2中的方法(如果被覆盖)也必须为{{ 1}}; Java在覆盖时对方法的访问施加额外限制是非法的。如果public包含C1方法,则protected中的重写方法可能是C2protected

即使publicC1类,这些规则也适用。 所以我认为原因是类(所有继承自Object)的类可以声明自己的覆盖Objectclone方法,如果他们选择的话,可以使它们成为finalize,而不是protected

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

C2

这应该表明虽然子类可以访问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的声明将合法。

答案 2 :(得分:4)

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

答案 3 :(得分:0)

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