编程语言
首页 > 编程语言> > java – 方法重写访问修饰符和返回类型限制

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

作者:互联网

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

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

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

解决方法:

重写方法不能具有比它覆盖的方法更“宽”的返回类型1,这就是你在这里所做的.来自Base的aMethod只能返回一个Integer,因此使用可返回任何Number的内容覆盖它是无效的,例如Floats.这就是您在当前代码中收到编译错误的原因.

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

his comment@user3580294点也是如此.

1然而,反向是有效的.例如,以下是合法的:

class Base {
    Number aMethod() {   // notice the return type is `Number`
        return 0;
    }
}

class OverRidingRules extends Base {
    Integer aMethod() {  // notice the return type is `Integer`
        return 0;
    }
}

换句话说,重写方法可以具有比其覆盖的方法“更窄”的返回类型.

标签:java,access-modifiers,method-overriding
来源: https://codeday.me/bug/20190624/1278489.html