0

0

Java中的方法_定义、调用、重载、重写与参数传递机制详解

幻夢星雲

幻夢星雲

发布时间:2026-02-16 12:30:02

|

135人浏览过

|

来源于php中文网

原创

java方法重载是编译期静态绑定,依据形参类型匹配签名;重写是运行期动态绑定,依据实际对象类型;参数传递均为值传递,引用类型传递的是地址副本。

java中的方法_定义、调用、重载、重写与参数传递机制详解

Java 中的方法定义和调用本身不难,但重载(overload)和重写(override)经常被混淆,参数传递机制又常被误认为“支持引用传递”,这些地方一旦理解偏差,会在调试时浪费大量时间。

方法定义与调用:签名决定能否被找到

方法是否能被调用,只取决于编译期能否匹配到一个明确的 方法签名(即方法名 + 参数类型序列,与返回值、修饰符无关)。JVM 不关心返回值类型,所以仅靠返回值不同无法构成重载。

  • public void print(String s)private void print(String s) 是同一个签名,编译失败(重复声明)
  • void print(int x)void print(Integer x) 是两个不同签名,可以共存(自动装箱不改变签名判定时机)
  • 调用 print(5) 会优先匹配 int 版本,而非 Integer;除非显式写成 print((Integer)5)

重载(Overload):编译期绑定,看的是“形参类型”

重载发生在同一个类中,是静态多态。编译器根据调用处传入的实参类型(不是运行时对象类型!)决定调用哪个方法。

  • 子类中定义 void show(Object o)void show(String s),调用 show(null) 会编译报错:歧义(null 可匹配任意引用类型)
  • float 类型实参传给 double 形参方法是合法的(自动提升),但不会触发 float 版本重载(如果存在)
  • 可变参数(... )是重载的“兜底选项”,只有在无更精确匹配时才启用;method(String...)method(Object) 更具体

重写(Override):运行期绑定,看的是“实际对象类型”

重写要求子类方法与父类方法具有相同签名(包括返回类型协变)、访问权限不能更严格、不能抛出新或更宽泛的检查异常。它由 JVM 在运行时通过虚方法表(vtable)动态分派。

今天学点啥
今天学点啥

秘塔AI推出的AI学习助手

下载

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

  • 若父类方法是 protected void run(),子类重写为 public void run() 合法;但 private void run() 是定义新方法,不是重写
  • @Override 注解不是必需的,但强烈建议加上——它能在父类方法被删/改名时立刻报错,而不是静默变成重载或新方法
  • 构造器、static 方法、final 方法不能被重写;其中 static 方法看似“重写”,实则是隐藏(hiding),调用取决于引用类型而非对象类型

参数传递:Java 只有值传递,对象也是传“引用的值”

Java 中所有参数都是值传递。基本类型传的是值的副本;引用类型传的是“对象地址的副本”。这意味着你无法在方法内让外部引用指向新对象,但可以通过该引用来修改对象状态。

  • void swap(StringBuilder a, StringBuilder b) { StringBuilder t = a; a = b; b = t; } —— 外部变量不会交换,因为 ab 是局部拷贝
  • void append(StringBuilder sb) { sb.append("x"); } —— 外部 sb 内容会变,因为操作的是同一堆内存中的对象
  • 不可变类(如 String)会让这个机制显得像“传值”,其实是对象本身不允许修改,不是传递方式变了

最容易被忽略的是:重载解析完全在编译期完成,而重写调用在运行期才确定;参数传递机制则从头到尾没有“引用传递”这回事——哪怕你看到 list.add() 改变了外部列表,也只是因为你持有的是同一份堆内存的地址副本。

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

12

2026.02.03

string转int
string转int

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

750

2023.08.02

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

590

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

105

2025.10.23

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

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

244

2023.09.22

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

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

746

2024.03.01

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

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

22

2025.11.27

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

145

2026.02.13

热门下载

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

精品课程

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

共23课时 | 3.6万人学习

C# 教程
C# 教程

共94课时 | 9.5万人学习

Java 教程
Java 教程

共578课时 | 66.1万人学习

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

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