0

0

Java里方法重载和重写有什么区别_Java多态实现方式说明

P粉602998670

P粉602998670

发布时间:2025-12-31 18:36:10

|

860人浏览过

|

来源于php中文网

原创

重载是编译期行为,发生在同一类中,仅由方法名和参数列表(类型、数量、顺序)决定;重写是运行期多态核心,发生在父子类间,要求签名一致、访问不更严、异常不更宽,且需@override校验。

java里方法重载和重写有什么区别_java多态实现方式说明

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

方法重载是编译期行为,JVM 在编译时就根据 方法名参数类型、数量、顺序 确定调用哪个方法。返回类型、访问修饰符、异常声明都不参与重载判断。

常见错误:以为改了 return 类型就算重载 —— 不算,会编译报错 method xxx is already defined

  • void print(String s)void print(int i) 是重载
  • String get()int get() 不是重载,编译失败
  • void show(List<string> list)</string>void show(List<integer> list)</integer> 也不是重载(泛型擦除后都是 List

重写(Override)发生在父子类之间,必须满足签名一致+访问更宽+异常更窄

重写是运行期多态的核心,依赖对象实际类型(而非引用类型)决定调用哪个方法。但前提是方法签名完全一致,且满足以下约束:

  • 方法名参数列表返回类型(或其子类型,Java 5 起支持协变返回)必须相同
  • 访问修饰符 不能比父类更严格(privateprotected ✅,publicprivate ❌)
  • 抛出的 checked exception 不能比父类更多(throws IOException 可重写为不抛或只抛 FileNotFoundException
  • finalstaticprivate 修饰的方法不能被重写
class Animal {
    public void speak() { System.out.println("sound"); }
}
class Dog extends Animal {
    @Override
    public void speak() { System.out.println("woof"); } // ✅ 正确重写
}

多态实现靠重写 + 向上转型 + 运行时绑定

Java 的多态不是靠重载,而是靠重写配合引用类型的动态分派。关键在于:声明类型是父类,实际对象是子类,调用时走的是子类重写后的方法。

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

Q.AI视频生成工具
Q.AI视频生成工具

支持一分钟生成专业级短视频,多种生成方式,AI视频脚本,在线云编辑,画面自由替换,热门配音媲美真人音色,更多强大功能尽在QAI

下载

容易忽略的点:static 方法和 private 方法不参与多态 —— 它们是静态绑定,看的是引用类型,不是实际对象类型。

  • Animal a = new Dog(); a.speak(); → 调用 Dog.speak()
  • Animal a = new Dog(); a.staticMethod(); → 调用 Animal.staticMethod()(即使 Dog 里有同名 static 方法)
  • super 关键字调用的是编译期确定的父类版本,和多态无关

@Override 注解不是可选的,是防错必需的

@Override 不是为了“表明意图”,而是让编译器帮你检查是否真的构成重写。漏掉它可能导致你以为重写了,其实只是定义了一个新方法(比如拼错方法名、参数类型写成 int 而非 Integer),结果多态失效,bug 难发现。

示例:

class Parent { void run() {} }
class Child extends Parent {
    @Override
    void runn() {} // 编译报错:method does not override or implement a method from a supertype
}

没加 @Override,这个 runn() 就只是个普通方法,和多态完全无关。

重载和重写的边界很清晰,但真正难的是在复杂继承链和泛型混合场景下判断某个调用到底走的是哪个版本 —— 这时候得看字节码里的 invokevirtual 指令目标,而不是凭感觉猜。

热门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

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中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

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# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

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

3

2026.03.11

热门下载

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

精品课程

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

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.1万人学习

Java 教程
Java 教程

共578课时 | 80.6万人学习

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

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