为什么Java中的Object class包含受保护的方法,例如clone()
和finalize()
,如果您使用或编写的所有类都继承了Object的实例方法?
答案 0 :(得分:5)
protected
中有两种Object
方法:clone()
和finalize()
。
finalize()
不旨在由客户端代码调用,但可能被子类覆盖 - 因此,它受到保护。
clone()
的{{1}}不打算由客户端调用 - 除非它已被子类显式覆盖并生成Object
。
答案 1 :(得分:5)
如果类C2
扩展C1
,而C1
包含public
方法,则C2
中的方法(如果被覆盖)也必须为{{ 1}}; Java在覆盖时对方法的访问施加额外限制是非法的。如果public
包含C1
方法,则protected
中的重写方法可能是C2
或protected
。
即使public
是C1
类,这些规则也适用。
所以我认为原因是类(所有继承自Object
)的类可以声明自己的覆盖Object
和clone
方法,如果他们选择的话,可以使它们成为finalize
,而不是protected
。
编辑:这样做的一个重要结果是public
和clone
不像公共成员那样可以自由访问。在类finalize
中,您可以在C2
类型的对象上使用clone
和finalize
,因为它们是受保护的方法,因此可用于子类{{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
,如果用户想要clone
或finalize
,则不清楚该怎么做。这就是为什么我们有机会覆盖这些方法并创建我们自己的实现。
答案 3 :(得分:0)
对象类包含带有protected修饰符的finalize()和clone()方法,以便开发人员可以决定是否可以使用protected或public修饰符覆盖这些方法。完全取决于需求,我们是否允许客户端代码是否称这些方法。