5

当我们知道在 java 中所有类默认扩展 Object 类时,为什么有带有 public 修饰符的方法,其中受保护的方法足以从任何类访问这些方法?所以需要一些这方面的信息。谢谢。

4

4 回答 4

11

如果 Object 方法不是公共的(或包范围的),则不能从子对象外部调用它们。它们被所有 Java 对象继承的事实与这些方法的范围正交。

简单的例子:你多久打电话一次x.toString()?如果该方法不公开,您将无法做到这一点。如果 Object 中根本不存在该方法,则您必须为每个新类重新实现它。

于 2010-08-15T15:30:13.510 回答
1

clone()是 Object 上的受保护方法,您不能调用clone()其他类的实例。

于 2010-08-15T15:32:53.383 回答
1

<Edit> 虽然一个对象可以访问同一个类的所有对象的私有属性,但你不能从其他类访问一个对象的受保护方法,即使受保护方法是在公共超类中定义的。

所以当这段代码编译时:

public class Test {
    private int x;

    private void change(Test test) {
        test.x = test.x + 1;
    }

    public static void main() {
        Test test1 = new Test();
        Test test2 = new Test();
        test1.change(test2);
    }
}

以下代码将无法编译:

public class Test2 {
    public static void main() {
         Test1 test1 = new Test1();
         test1.clone();   // The method clone() from the type Object is not visible
    }
}

</编辑>

能够调用toString(), equals(Object),hashCode()getClass() on all objects makes things a lot easier.

clone() and finalize() are protected. So in order to be able to call them from the outside the subclass has to increase the visibility. And that is obviously a design decision.

To be honest, i have no idea why Sun decided that all object are "locks" and have notify(), notifyAll(), wait(long), wait(long, int). 从我的角度来看,这些方法根本不应该在 Object 中,而应该在专门的 Lock 类中。但我想有一个很好的理由在早期将它们放在那里,现在如果不破坏兼容性就无法改变它。

于 2010-08-15T15:42:43.517 回答
1

as protected 足以从任何类访问这些方法

从任何班级,是的,但不是在任何班级Object

Java 语言规范定义protected如下含义:

对象的受保护成员或构造函数可以从包外部访问,在该包中,仅由负责实现该对象的代码声明它。

也就是说,子类 S 只能在 S 的实例上调用超类 C 的受保护构造函数/成员。

于 2010-08-15T15:52:46.547 回答