将调用哪个Java方法(继承,否@Override)

时间:2014-12-29 12:36:14

标签: java inheritance override

我有以下课程:

Class X 
{
    void f() { ... }
}

Class Y extends X 
{
    void f() {....}
}

Class Z extends Y 
{
    // No void f() method declared here
}

f()对象上调用Z会导致Y.f()被执行。我希望X.f()会被执行,因为Y.f()没有@Override注释。

我的问题:是否总是会执行最具体的方法,或者这种行为的原因是什么?

谢谢!

2 个答案:

答案 0 :(得分:3)

@Override注释是可选的。为了使子类的方法覆盖具有相同签名的基类的方法,不需要使用它。

使用@Override注释只会有助于捕捉拼写错误。例如,如果重写方法没有确切的名称作为它应该覆盖的方法,编译器将抱怨没有匹配的方法来覆盖。如果没有注释,编译器就不知道您打算覆盖基类方法。

所以,是的,只要具有足够的访问级别(在您的示例中,如果Y的{​​{1}}是私有的,f(),则始终会执行最具体的方法而'X将被执行而不是)。

答案 1 :(得分:0)

是的,如果没有特定标签覆盖您正在做的所有事情就是创建新方法