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类包含了finalise()和clone()方法,这两个方法的修饰符为protected,因此开发人员可以决定是否将这些方法重写为protected或public。这意味着完全取决于需求,我们是否允许客户端代码调用这些方法。