我有以下课程:
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
注释。
我的问题:是否总是会执行最具体的方法,或者这种行为的原因是什么?
谢谢!
答案 0 :(得分:3)
@Override注释是可选的。为了使子类的方法覆盖具有相同签名的基类的方法,不需要使用它。
使用@Override
注释只会有助于捕捉拼写错误。例如,如果重写方法没有确切的名称作为它应该覆盖的方法,编译器将抱怨没有匹配的方法来覆盖。如果没有注释,编译器就不知道您打算覆盖基类方法。
所以,是的,只要具有足够的访问级别(在您的示例中,如果Y
的{{1}}是私有的,f()
,则始终会执行最具体的方法而'X
将被执行而不是)。
答案 1 :(得分:0)
是的,如果没有特定标签覆盖您正在做的所有事情就是创建新方法