0

0

如何在Java中重写(Override)父类方法_@Override注解的作用

P粉602998670

P粉602998670

发布时间:2026-03-12 11:23:32

|

285人浏览过

|

来源于php中文网

原创

不加 @override 可能导致静默失败,即误写为新方法而非重写;加上后编译器强制校验签名匹配,及时报错。

如何在java中重写(override)父类方法_@override注解的作用

重写方法时没加 @Override 会怎样

不会报错,但可能掩盖严重问题。Java 允许你“假装”重写一个方法,比如拼错父类方法名、参数类型写成 int 而不是 Integer、漏掉 throws 声明——这些都会导致你实际定义的是一个全新方法,而非重写。父类逻辑照常执行,子类代码根本不会被调用。

加上 @Override 后,编译器立刻检查:这个方法是否真能在父类(或接口)里找到匹配签名。找不到就直接报错,强迫你面对问题。

  • 不加注解 → 静默失败,运行时行为诡异,调试成本高
  • 加了注解 → 编译期拦截,错误信息明确指向 method does not override or implement a method from a supertype
  • IDE(如 IntelliJ)默认在重写时自动插入 @Override,别手抖删掉

@Override 在接口实现中必须加吗

必须加,而且从 Java 6 开始就支持了。很多人以为它只用于继承场景,其实实现接口的抽象方法也属于重写(JVM 层面叫 override),@Override 同样起校验作用。

常见翻车点:接口升级新增 default 方法,你本地没更新接口定义,却在实现类里“重写”了它——没加 @Override 就发现不了签名已不匹配。

立即学习Java免费学习笔记(深入)”;

智川X-Agent
智川X-Agent

中科闻歌推出的一站式AI智能体开发平台

下载
  • 接口方法名改了?加了新参数?返回类型变了?@Override 会第一时间告诉你
  • 用了 Lombok 的 @Data@Builder?它们生成的 toString()equals() 等方法,如果想重写,也得手动加 @Override,否则生成的方法和你的冲突

重写时参数/返回类型写错的典型表现

看似写了 @Override,但编译还是过不去,大概率是签名细节对不上。Java 对重写的要求非常严格:方法名、参数数量与类型、返回类型(协变返回除外)、异常声明都得匹配。

例如父类有 protected List<string> getData()</string>,你写成 public ArrayList<string> getData()</string> —— 返回类型虽是子类,但 ArrayList 不是 List 的子类型(而是实现类),这不算协变,编译失败。

  • 参数用 int vs Integer:基本类型和包装类互不兼容,不是重写
  • 泛型擦除后签名相同,但带泛型声明不同:如 void process(List<string>)</string>void process(List<object>)</object>,编译器视为两个方法
  • 静态方法不能被重写:哪怕加了 @Override,也会报错,因为它是隐藏(hiding),不是重写

为什么有些老项目里完全不用 @Override

因为它们还在用 Java 5。该注解是 Java 5 引入,但直到 Java 6 才支持对接口方法的标记。如果你看到没有 @Override 的代码,先看 source 编译级别;如果是 Java 5 项目,加了反而编译不过。

现在几乎没人再用 Java 5,所以这个“历史原因”只是排查冷门问题时的线索,不是合理跳过的理由。

  • Maven 项目检查 <source>1.5</source> 配置
  • Android 项目注意 compileSdkVersionsourceCompatibility 是否一致
  • 加了但编译报错 annotation type not applicable to this kind of declaration?说明 JDK 版本太低,或 IDE 没正确识别语言级别

最常被忽略的一点:@Override 是给编译器和人看的,不是给 JVM 运行时用的。它不改变任何行为,只增加一层契约约束。一旦习惯性加上,你会明显少 debug 半天“为啥我的方法没被调用”。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

0

2025.09.15

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

611

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

334

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

235

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

186

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

134

2025.11.27

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.1万人学习

Java 教程
Java 教程

共578课时 | 80.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号