我的问题来自一个项目。因此,让我抽象出一些不相关的细节。
我有一个JAVA公共类A,它有两个受保护的静态方法,foo()和bar()。方法foo()在其体内调用bar()。
public class A{
protected static foo(){
...
bar()
...
}
protected static bar(){print("A.bar()");}
}
现在我还有一个B级扩展A.在B中,我覆盖了bar()
class B extends A{
@Overrides
static protected bar(){ print("A.bar() extended");
}
最后,我从B
中的一个类调用foo()class B extends A{
...
public static main(){foo()}
}
我无法理解两点 1.编译器(Eclipse)要求我删除@Override注释。为什么? 2.最后main()输出“A.bar()”,这意味着已解析的bar()目标是A类,但我打算覆盖bar()并使用A的foo()来调用修改后的bar( )。我怎样才能做到这一点?
你有什么看法?
答案 0 :(得分:7)
A.foo()
,然后拨打A.bar()
。由于您没有实例,因此覆盖方法不起作用。您需要从代码中删除所有static
并在主网址中使用new B().foo()
。
请考虑阅读此tutorial。
答案 1 :(得分:6)
您不能覆盖静态方法,只能覆盖非静态实例方法。您试图在静态环境中使用继承,但这不会起作用。如果你真的需要继承(通常当你认为你做的时候,你真的没有),那么就让这些方法成为非静态的。