【问题标题】:Why can't you reduce the visibility of a method in a Java subclass?为什么不能降低 Java 子类中方法的可见性?
【发布时间】:2009-10-21 12:58:14
【问题描述】:

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

【问题讨论】:

    标签: java polymorphism overriding subclassing


    【解决方案1】:

    因为子类的每个实例仍然需要是基类的有效实例(请参阅Liskov substitution principle)。

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

    【讨论】:

    • 但是为什么不允许我们重写受保护的方法并将其更改为私有?由于公共接口仍然相同,因此不会以这种方式破坏 LSP。
    • 公共接口不变,但受保护的接口不变。父类中的代码无法访问自己有血有肉的方法:(
    【解决方案2】:

    因为如果允许的话,可能会出现以下情况:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2023-03-16
        • 2022-08-18
        • 2014-09-03
        • 2015-01-13
        • 1970-01-01
        • 2018-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多