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

2022-09-01 01:57:56

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


答案 1

因为子类的每个实例仍然需要是基类的有效实例(参见Liskov替换原理)。

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


答案 2

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

类子继承自类父级。父方法有一个公共方法,Sub使该方法私有。现在,下面的代码可以正常编译,因为 声明的类型是 Parent:foobar

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

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


推荐