为什么不能减lessJava子类中方法的可见性?

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

因为子类的每个实例仍然需要是基类的有效实例(请参阅Liskovreplace原理 )。

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

因为如果这是允许的,以下情况将是可能的:

类Sub从类Parentinheritance。 父母有一个公共方法foo ,Sub使该方法私人。 现在下面的代码可以很好地编译,因为声明的bartypes是Parent:

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

不过,目前尚不清楚这应该如何performance。 一种可能性是让它导致运行时错误。 另一种方法是简单地允许它,这样就可以从外部调用一个私有方法,只需要转换到父类。 这两种替代方法都不能接受,所以不允许。

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