@override 是编译期校验注解,用于检查方法是否正确重写父类或接口中可被重写的方法,校验内容包括方法名、参数列表、返回类型协变性、访问修饰符,不适用于 private/static/final 方法,无运行时开销。

@Override 注解本身不执行任何运行时操作,它的作用是向编译器发出明确信号:“这个方法意图重写父类或接口中已有的方法,请帮我检查是否真能成功覆盖”。一旦标注,Java 编译器(如 javac)会在编译阶段立即启动静态校验流程。
校验触发时机:编译时逐项比对签名
编译器拿到带 @Override 的方法后,会严格查找其直接父类(或所实现的接口)中是否存在一个**可被重写**的方法,并比对以下要素:
-
方法名完全一致:大小写敏感,
toString()和ToString()视为不同方法 -
参数列表完全匹配:类型、个数、顺序三者缺一不可;
int与Integer、String与Object均不兼容 -
返回类型协变兼容:允许子类返回更具体的类型(如父类返回
Animal,子类返回Dog),但不能扩大(父类返回String,子类不能返回Object) -
访问修饰符不更严格:父类是
protected,子类可用protected或public;若写成private则直接报错 -
不针对禁止重写的方法:对
private、static、final方法加 @Override,编译器立刻拒绝
校验失败的典型错误提示
只要任一条件不满足,编译就会中断,并抛出清晰错误信息,例如:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
method does not override or implement a method from a supertype:父类/接口中根本没找到匹配方法(常见于继承关系错误、接口未更新、方法被删) -
cannot reduce the visibility of inherited method:子类访问权限比父类更窄 -
attempt to assign weaker access:包私有方法在跨包子类中被声明为protected等冲突 - 泛型方法漏写类型参数时,descriptor 不匹配也会触发同款报错
为什么它不依赖运行时或 JVM
@Override 是纯编译期机制,不生成字节码指令,也不影响类加载或方法调用过程。它不涉及反射、代理或 Spring AOP 等运行时环境——哪怕项目用 Spring Boot,只要 javac 能过,就说明签名已通过语言级契约验证。这也意味着零性能开销,且 IDE(IntelliJ/Eclipse)在编辑时就能实时提示。
接口方法同样适用,且从 Java 6 起正式支持
实现接口的抽象方法、重写接口中的 default 方法,都属于重写语义,必须加 @Override。比如接口新增 default 方法,而你本地未同步更新接口定义,此时实现类里“自以为是”的重写就会因签名不匹配被编译器当场拦截,避免逻辑 silently 失效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










