为什么不能降低Java子类中方法的可见性?

时间:2009-10-21 12:58:14

标签: java polymorphism override subclassing

为什么编译器在覆盖子类时减少方法的可见性时会给出错误消息?

3 个答案:

答案 0 :(得分:65)

因为子类的每个实例仍然需要是基类的有效实例(参见Liskov substitution principle)。

如果子类突然丢失了基类的一个属性(例如公共方法),那么它将不再是基类的有效替代。

答案 1 :(得分:18)

因为如果允许这样做,可能会出现以下情况:

Class Sub继承自Parent类。 Parent有一个公共方法foo,Sub将该方法设为私有。现在,下面的代码可以正常编译,因为声明的bar类型是Parent:

Parent bar = new Sub();
bar.foo();

然而,目前尚不清楚这应该如何表现。一种可能性是让它导致运行时错误。另一种方法是简单地允许它,这样就可以通过转换到父类来从外部调用私有方法。这些替代方案都不可接受,因此不允许。

答案 2 :(得分:1)

因为子类型必须可用作其超类型的实例。