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

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

1
那么派生类继承它时不需要将其设置为公共的? - Oliver Charlesworth
1
"protected" 成员只有在同一个包或子类中才可见。请澄清您的问题。 - Sotirios Delimanolis
2
@EJP 我能理解为什么这很令人惊讶。通常的简单解释是公共成员对所有其他类都可用,而受保护的成员仅对该类的子类可用。但如果一切都是Object的子类,那么这意味着没有区别,对吧?那么为什么要将其中一些设置为“protected”?这就是我认为OP的出发点。然而,事实是,“protected”有额外的后果超出了简单的解释,例如影响可以在覆盖上使用的访问修饰符。 - ajb
@ajb 我对猜测 OP 可能会怎么想一点也不感兴趣。他需要澄清自己的问题,解释他的惊讶等等。 - user207421
2
@EJP 除了你之前的评论有点暗示他必须有些无知才会如此惊讶。如果你认为我不应该猜测他的想法,那么你可能也不应该猜测他是否无知。事实上,几个月前我也曾想过同样的问题,出于我所阐述的原因,这需要一些思考才能弄清楚为什么他们会费心去做这件事;这是非平凡的。 - ajb
显示剩余3条评论
4个回答

7
如果类C2继承自C1,并且C1包含一个public方法,那么在C2中覆盖的方法也必须是public的。在Java中,当覆盖方法时,不能增加访问方法的限制。如果C1包含一个protected方法,则C2中的重写方法可以是protected或public。
即使C1是Object类,这些规则也适用。因此,我认为原因是类(所有类都继承自Object)可以声明自己的重写clone和finalize方法,并将它们设置为protected,而不是public。
编辑:这个规则的一个重要后果是,clone和finalize方法并不像public成员那样自由地可访问。在C2类中,您可以随意使用类型为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的声明将变为合法。


5

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

finalize() 不打算由客户端代码调用,但可能被子类覆盖 - 因此,它是受保护的。

Objectclone() 也不打算由客户端调用 - 除非它已经被子类明确覆盖并变成了 public


4

这样做是因为对于通用的抽象Object,如果用户想要clonefinalize它,在不清楚该如何处理的情况下,我们有机会重写这些方法并创建自己的实现。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接