【发布时间】:2009-10-21 12:58:14
【问题描述】:
为什么当您在子类中重写方法时降低了方法的可见性时编译器会给出错误消息?
【问题讨论】:
标签: java polymorphism overriding subclassing
为什么当您在子类中重写方法时降低了方法的可见性时编译器会给出错误消息?
【问题讨论】:
标签: java polymorphism overriding subclassing
因为子类的每个实例仍然需要是基类的有效实例(请参阅Liskov substitution principle)。
如果子类突然失去了基类的一个属性(例如公共方法),那么它将不再是基类的有效替代品。
【讨论】:
因为如果允许的话,可能会出现以下情况:
Sub 类继承自 Parent 类。 Parent 有一个公共方法foo,Sub 将该方法设为私有。现在下面的代码可以正常编译了,因为 bar 的声明类型是 Parent:
Parent bar = new Sub();
bar.foo();
但是不清楚这应该如何表现。一种可能性是让它导致运行时错误。另一种方法是简单地允许它,这样就可以通过转换到父类来从外部调用私有方法。这两种选择都不可接受,因此是不允许的。
【讨论】:
因为子类型必须可用作其超类型的实例。
【讨论】: