为何@Override注解无法作用于静态方法?编译报错解析
为何@Override注解无法作用于静态方法?
测试代码
test.java
public class test { protected static void testMethod() {} }
testb.java
public class testb extends test { @Override protected static void testMethod() {} }
编译与错误信息
执行编译命令:
javac test.java testb.java
编译报错:
% javac test.java testb.java testb.java:5: error: method does not override or implement a method from a supertype @Override ^ 1 error
问题解答
这是因为静态方法不存在“重写”(override)的概念,@Override注解就是用来标记实例方法对父类方法的重写,自然不能用在静态方法上。
具体来说:
- 实例方法的重写是基于多态的,子类实例调用方法时会动态绑定到子类的实现;而静态方法属于类本身,调用时是静态绑定到所属类,子类的同名静态方法只是隐藏(hide)了父类的方法,不是重写。
@Override注解的作用是让编译器帮你校验:这个方法是不是真的重写了父类的实例方法。但静态方法根本不符合重写的规则,所以编译器会报错提示“该方法没有重写或实现父类/接口的方法”。- 移除注解后,编译器不会做重写校验,子类隐藏父类静态方法是Java允许的行为,所以就能正常编译了。
内容的提问来源于stack exchange,提问作者nsayer
相关产品推荐
相关产品推荐

