0

0

Java中方法重载Overload与重写Override对比_Java语法辨析

P粉602998670

P粉602998670

发布时间:2026-03-04 08:01:03

|

901人浏览过

|

来源于php中文网

原创

重载发生在同一类中,靠参数列表区分,是编译期行为;重写发生在父子类间,要求签名一致,是运行期行为;构造方法可重载不可重写;泛型擦除和varargs易引发重载冲突,桥接方法由编译器自动生成。

java中方法重载overload与重写override对比_java语法辨析

重载(Overload)发生在同一个类里,靠参数列表区分

方法重载是编译期行为,JVM只看调用时传入的实参类型和个数,不看返回值或修饰符。哪怕两个方法仅返回值不同,javac 直接报错:method xxx() is already defined in class

  • 参数个数不同:如 print(String)print(String, String)
  • 参数类型不同:如 process(int)process(double)(注意基本类型与包装类不算自动重载,process(Integer)process(int) 是两个独立重载)
  • 参数顺序不同:如 build(String, int)build(int, String)

常见坑:泛型擦除后可能造成意外冲突。比如 handle(List<string>)</string>handle(List<integer>)</integer> 编译不过,因为擦除后都是 handle(List)

重写(Override)发生在父子类之间,必须满足签名一致

重写是运行期行为,由 JVM 根据对象实际类型决定调用哪个版本。子类方法必须和父类被重写方法有完全相同的 方法名参数列表返回类型(Java 5 起允许协变返回类型,即子类可返回更具体的子类型),且不能比父类更严格地限制访问权限。

  • 不能重写 private 方法——它对子类不可见,子类里同名方法只是新定义
  • static 方法不能被重写(但可以被“隐藏”,调用取决于引用类型,不是实际类型)
  • 加了 @Override 注解却没真正重写时,javac 会报错,这是最有效的防错手段

典型错误现象:java.lang.NoSuchMethodError 往往不是重写问题,而是编译时用了新版接口、运行时加载了旧版类;而 ClassCastException 或静默调用父类方法,常因忘了加 @Override 导致“以为重写了,其实没重写”。

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

Lemonaid
Lemonaid

AI音乐生成工具,在音乐领域掀起人工智能革命

下载

构造方法既不能重写,也不能被继承,但可以重载

构造方法名字固定为类名,没有返回类型,天然不满足重写条件(重写要求方法签名相同,而父类构造方法根本不会出现在子类中)。子类构造器第一行默认调用 super(),但这不是重写,只是显式/隐式调用父类构造逻辑。

  • 每个类都可以定义多个构造方法,彼此是重载关系
  • 如果父类只有带参构造器,子类必须显式调用 super(xxx),否则编译失败:constructor xxx in class YYY cannot be applied to given types
  • 抽象类的构造器也能被重载,只是不能直接 new

容易忽略的一点:匿名内部类在创建时写的构造逻辑,其实是外层类某个构造器的重载调用入口,不是重写。

泛型方法和 varargs 在重载/重写中特别容易误判

泛型方法的类型参数在编译期擦除,varargs 实际被转成数组,这两者叠加会让重载解析变得反直觉。

  • foo(List<string>)</string>foo(List) 不能共存——后者会被视为前者擦除后的签名,编译失败
  • bar(String...)bar(String[]) 不能同时存在,因为 varargs 底层就是数组
  • 重写时若父类方法是 <t> T get()</t>,子类重写必须保持同样泛型结构,不能改成 Object get(),否则不是重写而是重载(且可能引发桥接方法问题)

最麻烦的是桥接方法(bridge method):当你重写一个泛型父类方法时,编译器会悄悄生成一个非泛型的桥接方法来保证多态正确性。这个过程对开发者透明,但如果你用反射查 getDeclaredMethods(),会看到多出的方法,别慌——那是编译器干的。

热门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的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

17

2026.02.03

string转int
string转int

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

930

2023.08.02

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

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

27

2025.11.27

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

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

27

2025.11.27

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

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

27

2025.11.27

string转int
string转int

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

930

2023.08.02

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

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

600

2024.08.29

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

0

2026.03.04

热门下载

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

精品课程

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

共23课时 | 4.1万人学习

C# 教程
C# 教程

共94课时 | 10.6万人学习

Java 教程
Java 教程

共578课时 | 76.1万人学习

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

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