0

0

在Java中方法重写的注意事项_Java方法覆盖规则解析

P粉602998670

P粉602998670

发布时间:2026-02-07 14:11:49

|

454人浏览过

|

来源于php中文网

原创

重写方法的访问修饰符不能比父类更严格:public只能被public重写,protected可被protected或public重写,不可降为private或默认;default方法仅同包可重写;final、static、构造器不可重写;必须用@Override校验签名;返回类型须协变;检查异常只能缩小不能扩大。

在java中方法重写的注意事项_java方法覆盖规则解析

重写方法的访问修饰符不能比父类更严格

子类重写父类方法时,public 方法只能被 public 重写,protected 可以被 protectedpublic 重写,但不能降为 private 或包私有(默认)。否则编译直接报错:Cannot reduce the visibility of the inherited method

常见错误场景:父类用 protected 定义工具方法,子类误写成 private void doWork() —— 这不是重写,而是定义了一个新方法,父类调用仍走原逻辑,容易引发行为不一致。

  • 父类 default(包级私有)方法,子类只能在同包中重写,且不能加 privateprotected
  • final 方法无法被重写,强行写同签名方法会变成编译错误,不是覆盖
  • 构造器、静态方法(static)不能被重写,它们属于类而非实例,子类里同名 static 方法只是隐藏(hiding)

@Override 注解不是可选的装饰,而是编译期校验开关

没加 @Override 不影响运行时重写行为,但它能帮你提前发现拼写错误、参数类型不匹配、返回值协变违规等问题。比如父类是 String getName(),子类写成 String getname()(小写 n),不加注解可能悄无声息地新增一个方法;加上后立刻报错:method does not override or implement a method from a supertype

建议所有明确意图是重写的方法都强制加 @Override,尤其在使用 IDE 重构或继承深度较大时——它本质是告诉编译器:“我确认这个方法要覆盖父类,请帮我核对签名”。

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

影谱
影谱

汉语电影AI辅助创作平台

下载
  • 接口默认方法(default)被实现类重写时,也必须加 @Override
  • 重写抽象方法时同样需要,哪怕父类是 abstract 类或接口
  • 如果父类方法后来被删掉或改名,有注解的子类代码会立即编译失败,避免“假覆盖”残留

返回类型必须是协变的(covariant),不能随意变更

Java 5 起允许重写方法的返回类型是父类返回类型的子类型,比如父类返回 Object,子类可返回 String;父类返回 List,子类可返回 ArrayList。但反过来不行,也不能改成无关类型(如父类 Number,子类返回 String)。

注意:基本类型和装箱类型不算协变关系。例如父类返回 int,子类不能返回 Integer(会编译报错:return type is incompatible with),因为这是两个不同签名(一个是基本类型,一个是引用类型)。

  • 泛型擦除后若签名实质相同,但返回类型不满足协变,依然编译失败
  • 重写时若父类返回 void,子类也必须是 void,不可改为任意其他类型
  • 协变只适用于返回类型,不适用于参数类型——参数必须完全一致(或满足逆变?不,Java 重写要求参数类型严格一致)

异常声明只能缩小,不能扩大或新增检查异常

子类重写方法可以:不抛出任何异常、只抛出父类声明的检查异常(Exception 子类)、或抛出更具体的检查异常(如父类抛 IOException,子类可抛 FileNotFoundException)。但不能新增未声明的检查异常,也不能把检查异常换成运行时异常以外的其他检查异常。

典型翻车点:父类方法声明 throws SQLException,子类想加日志后抛 RuntimeException 是允许的;但如果写成 throws SQLException, IllegalArgumentException,后者是运行时异常,语法合法;但若加的是 throws SQLException, IOException,就会编译失败——因为 IOException 没在父类声明中出现过。

  • 运行时异常(RuntimeException 及其子类)不受限制,可自由添加或删除
  • 父类没声明任何检查异常,子类就不能声明任何检查异常
  • 这点常被忽略,尤其在封装 SDK 或中间件时,子类擅自扩大异常范围会导致调用方编译不过
重写真正难的不是语法,是语义一致性:方法名、参数、返回值、异常这些只是骨架,而子类实现是否保持了父类约定的行为契约(比如不改变线程安全性、不破坏幂等性、不绕过前置校验),这些没法靠编译器检查。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

179

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

222

2025.12.18

string转int
string转int

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

606

2023.08.02

string转int
string转int

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

606

2023.08.02

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

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

551

2024.08.29

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

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

173

2025.08.29

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

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

204

2025.08.29

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

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

179

2023.11.23

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.02.06

热门下载

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

精品课程

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

共23课时 | 3.3万人学习

C# 教程
C# 教程

共94课时 | 8.8万人学习

Java 教程
Java 教程

共578课时 | 59.4万人学习

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

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