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

ria*_*ria 42 java polymorphism overriding subclassing

当您在子类中重写方法时降低方法的可见性时,为什么编译器会给出错误消息?

Joa*_*uer 65

因为子类的每个实例仍然需要是基类的有效实例(请参阅Liskov替换原则).

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

  • 但是为什么我们不允许覆盖受保护的方法并将其更改为私有?由于公共接口仍然相同,因此不会以这种方式破坏LSP. (2认同)

sep*_*p2k 18

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

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

Parent bar = new Sub();
bar.foo();
Run Code Online (Sandbox Code Playgroud)

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