为什么不能减lessJava子类中方法的可见性?
为什么编译器在重写子类时降低方法的可见性时会给出错误消息?
因为子类的每个实例仍然需要是基类的有效实例(请参阅Liskovreplace原理 )。
如果子类突然丢失了基类的一个属性(例如公共方法),那么它将不再是基类的有效替代品。
因为如果这是允许的,以下情况将是可能的:
类Sub从类Parentinheritance。 父母有一个公共方法foo
,Sub使该方法私人。 现在下面的代码可以很好地编译,因为声明的bar
types是Parent:
Parent bar = new Sub(); bar.foo();
不过,目前尚不清楚这应该如何performance。 一种可能性是让它导致运行时错误。 另一种方法是简单地允许它,这样就可以从外部调用一个私有方法,只需要转换到父类。 这两种替代方法都不能接受,所以不允许。
因为子types必须可用作其超types的实例。