方法重写访问修饰符和返回类型限制

时间:2014-06-10 14:55:35

标签: java access-modifiers method-overriding

以下代码根据方法规则工作覆盖并显示编译错误与Base.aMethod()不兼容的返回类型

class Base
{
    Integer aMethod()
    {
        return 0;
    }
}
public class OverRidingRules extends Base
{
    protected Number aMethod()
    {
        return 0;
    }
}

但是如果我将Base.aMethod的访问修饰符从默认更改为私有,则它会成功编译。有人可以告诉我为什么编译器没有显示相同的错误吗?

1 个答案:

答案 0 :(得分:4)

最重要的方法是不能拥有更广泛的"返回类型比它覆盖 1 的方法,这是你在这里做的。来自aMethod的{​​{1}}只能 返回Base,因此使用可以返回任何Integer的内容覆盖它是无效的例如,包括Number s。这就是您在当前代码中收到编译错误的原因。

现在,当您将Float中的aMethod更改为Base时,在子类中无法再看到/覆盖它。因此,在这种情况下,private中的aMethod并未覆盖OverRidingRules中的aMethod,而是具有相同名称的独立方法,因此我们不会遇到与上面相同的问题,没有发生编译错误。

@user3580294也在his comment中指出了这一切。


1 但反过来是有效的。例如,以下内容是合法的:

Base

换句话说,一个重要的方法可以有一个更窄的"返回类型比它覆盖的方法。