当我们知道在 java 中所有类默认扩展 Object 类时,为什么有带有 public 修饰符的方法,其中受保护的方法足以从任何类访问这些方法?所以需要一些这方面的信息。谢谢。
4 回答
如果 Object 方法不是公共的(或包范围的),则不能从子对象外部调用它们。它们被所有 Java 对象继承的事实与这些方法的范围正交。
简单的例子:你多久打电话一次x.toString()
?如果该方法不公开,您将无法做到这一点。如果 Object 中根本不存在该方法,则您必须为每个新类重新实现它。
clone()
是 Object 上的受保护方法,您不能调用clone()
其他类的实例。
<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
. 从我的角度来看,这些方法根本不应该在 Object 中,而应该在专门的 Lock 类中。但我想有一个很好的理由在早期将它们放在那里,现在如果不破坏兼容性就无法改变它。notify()
, notifyAll()
, wait(long)
, wait(long, int)
as protected 足以从任何类访问这些方法
从任何班级,是的,但不是在任何班级Object
:
Java 语言规范定义了protected
如下含义:
对象的受保护成员或构造函数可以从包外部访问,在该包中,仅由负责实现该对象的代码声明它。
也就是说,子类 S 只能在 S 的实例上调用超类 C 的受保护构造函数/成员。