0

0

在Java中方法重载和方法重写的区别_Java方法调用机制解析

P粉602998670

P粉602998670

发布时间:2026-02-12 17:44:02

|

425人浏览过

|

来源于php中文网

原创

方法重载发生在同一类中,靠参数列表(类型、数量、顺序)区分,是编译期行为;重写发生在子类对父类非private/static/final方法的重新实现,是运行期行为,遵循签名一致和协变返回规则。

在java中方法重载和方法重写的区别_java方法调用机制解析

方法重载发生在同一个类中,靠参数列表区分

重载(Overloading)是编译期行为,只看调用时传入的实参类型、个数和顺序。只要 方法名 相同但 参数列表 不同(类型、数量、顺序任一不同),就算重载,返回类型和访问修饰符不影响判断。

常见错误:以为改了 return 类型或 throws 异常就算重载——其实不会通过编译,JVM 会报 duplicate method 错误。

实操注意点:

  • int add(int a, int b)double add(double a, double b) 是合法重载
  • void print(String s)void print(String... s) 也是重载(可变参数本质是数组,签名不同)
  • 自动拆箱/装箱可能引发歧义,比如 method(int)method(Integer) 同时存在时,传 5 会优先匹配 int 版本

方法重写必须有继承关系,且遵循协变规则

重写(Overriding)是运行期行为,发生在子类对父类非 private、非 static、非 final 方法的重新实现。JVM 在运行时根据对象实际类型决定调用哪个版本。

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

容易踩的坑:

Bing图像创建器
Bing图像创建器

必应出品基于DALL·E的AI绘图工具

下载
  • 子类方法签名必须与父类完全一致(包括方法名、参数列表),否则就是重载而非重写
  • @Override 注解不是可选的——不加可能导致你以为重写了,其实只是定义了一个新方法(比如拼错方法名,或父类方法是 protected 而你写成 public,但签名不符)
  • 返回类型可以是父类返回类型的子类型(协变返回),比如父类返回 Object,子类可返回 String;但参数类型不能变窄或变宽
  • static 方法不能被重写(只能被隐藏),哪怕子类写了同签名的 static 方法,调用仍取决于引用类型而非实际对象类型

重载解析在编译期完成,重写绑定在运行期发生

这是机制差异的核心。编译器看到 obj.method(1),会根据 obj 的声明类型(不是实际类型!)查找所有可用重载版本,选出最匹配的一个并固化为字节码中的符号引用;而 JVM 运行时才根据 obj 实际指向的对象类型,查虚方法表(vtable)跳转到真正的实现。

典型表现:

  • 父类引用指向子类对象:Animal a = new Dog();,若 Animalvoid speak()Dog 重写了它,则 a.speak() 调用的是 Dog 版本(重写生效)
  • 但如果 Animal 有两个重载:void feed(String food)void feed(Object o),而你写 a.feed(new Dog()),编译器只看 a 的声明类型 Animal,选的是 feed(Object),哪怕运行时 a 指向 Dog 实例——重载选择与实际类型无关

构造器、私有方法、静态方法不参与重写,但可被重载

构造器天然只能在本类内调用,所以不存在“子类重写父类构造器”的概念;private 方法无法被继承,自然谈不上重写;static 方法属于类而非实例,绑定在类加载阶段,没有动态分派过程。

但它们都可以在同一个类里被重载:

  • public MyClass() {}public MyClass(String name) {} 是构造器重载
  • private void helper(int x)private void helper(String s) 是私有方法重载(仅本类可见)
  • public static void log(String msg)public static void log(String msg, Throwable t) 是静态方法重载

真正容易混淆的是:子类定义了一个跟父类 static 方法同签名的 static 方法,这叫“隐藏”(hiding),不是重写——调用结果取决于变量声明类型,而不是对象实际类型。

热门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相关的文章、下载、课程内容,供大家免费下载体验。

191

2023.09.27

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

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

11

2026.02.03

string转int
string转int

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

708

2023.08.02

string转int
string转int

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

708

2023.08.02

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

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

559

2024.08.29

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

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

193

2025.08.29

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

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

206

2025.08.29

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

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

193

2025.08.29

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.02.12

热门下载

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

精品课程

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

共23课时 | 3.5万人学习

C# 教程
C# 教程

共94课时 | 9.3万人学习

Java 教程
Java 教程

共578课时 | 64.1万人学习

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

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