0

0

Java方法重载与方法重写的语法区别

P粉602998670

P粉602998670

发布时间:2026-01-08 08:21:09

|

270人浏览过

|

来源于php中文网

原创

方法重载发生在同一类中,仅由方法名和参数列表决定,与返回值等无关;方法重写发生在父子类间,要求方法名、参数、返回类型相同,是运行期动态绑定。

java方法重载与方法重写的语法区别

方法重载(Overload)发生在同一个类中

重载是编译期行为,只看**方法名和参数列表**,跟返回值类型、访问修饰符、异常声明完全无关。JVM 在编译时就根据调用处的实参类型和个数决定调用哪个重载版本。

  • 必须在同一个类里;static 方法可以重载,private 方法也可以(只是子类看不见)
  • 参数列表必须不同:类型、个数、顺序三者至少一个有差异;intInteger 算不同(涉及自动装箱时需小心歧义)
  • 返回值类型可以不同,但**仅靠返回值不同不能构成重载**——否则编译报错:error: method xxx() is already defined in class YYY
  • 常见误操作:把 void print(String s)String print(String s) 当作重载,实际不合法

方法重写(Override)发生在父子类之间

重写是运行期行为,核心是「子类提供父类已有方法的新实现」,受 @Override 注解约束,编译器会校验签名是否真正匹配父类可访问方法。

  • 子类方法必须与父类被重写方法有**相同的方法名、参数列表、返回类型**(Java 5 起支持协变返回类型,即子类可返回更具体的子类型)
  • 访问修饰符不能更严格:子类方法不能是 privateprotected(若父类是 public),但可以更宽松(如父类 protected,子类 public
  • 不能抛出比父类方法范围更广的检查异常(Exception),但可以抛出更具体的异常(IOException)或不抛异常
  • static 方法不能被重写(只能被隐藏),final 方法不能被重写,private 方法也不能被重写(它对子类不可见)

容易混淆的典型错误场景

很多问题不是语法写错,而是对「谁在调用」「绑定时机」理解偏差导致的意外行为。

游戏卡点销售充值程序
游戏卡点销售充值程序

可批量生成卡号与密码然后做成实物卡后销售给客户,客户到您的网站来用此卡号密码来提交充值相关游戏卡点、QQ币、其它数字卡等相关信息,(适合做"一卡通")而您在后台可监控客户的提交信息,并手动为客户完成充值后 点击完后重点功能如下:1、卡号、密码批量生成。2、添加和修改游戏名称、区、服务器、充值方法、游戏点卡列隔等充值选择3、开启充值网站和关闭充值网站的功能4、前台用所生成的卡号密

下载
  • 父类引用指向子类对象时,调用的是重写后的方法(动态绑定),但调用的是重载方法的哪一个,取决于**编译时的引用类型**。例如:
    Parent p = new Child();
    p.show(new String()); // 调用 Parent 中参数为 String 的 show
    p.show(new Object()); // 若 Parent 有 show(Object),则调用它 —— 不是看 Child 有没有更匹配的重载
  • 子类定义了与父类静态方法同名同参的方法,这不是重写,是**方法隐藏**:通过子类名调用走子类版本,通过父类名调用走父类版本
  • 泛型擦除后,<t> void m(T t)</t>void m(Object o)字节码层面可能冲突,导致编译失败,这种重载要格外谨慎
  • 构造方法永远不参与重写(没有继承关系),但可以重载;抽象方法必须被重写(除非子类也是抽象类)

如何快速判断是重载还是重写

看方法签名变化是否跨类、是否改了参数、是否加了 @Override 注解,再结合报错信息定位。

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

  • 如果编译报 method does not override or implement a method from a supertype,说明你写了 @Override 但没真正匹配父类方法——大概率是参数类型写错(比如用了 int[] 而非 int...),或父类方法是 private/static
  • 如果编译报 reference to xxx is ambiguous,说明重载选择不明确,比如传 null 给多个可接受引用类型的重载方法,需要显式强转
  • 运行时发现没走预期逻辑,先确认调用方变量声明类型(重载依据)和实际对象类型(重写依据),二者常被忽略
重载看「形参列表是否扩展了调用可能性」,重写看「子类是否替换了父类行为」。最常翻车的地方不在语法细节,而在多态调用时混淆了编译期解析和运行期绑定的边界。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

18

2026.02.03

string转int
string转int

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

1010

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

java多态详细介绍
java多态详细介绍

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

27

2025.11.27

java多态详细介绍
java多态详细介绍

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

27

2025.11.27

java多态详细介绍
java多态详细介绍

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

27

2025.11.27

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

22

2026.03.10

热门下载

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

精品课程

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

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.1万人学习

Java 教程
Java 教程

共578课时 | 80.4万人学习

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

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