跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

聊聊Java的方法:定义、重载与递归

Java 方法将可重用逻辑封装为代码块,包括修饰符、返回值、方法名和参数。形参是实参的拷贝,修改形参不影响调用处的值。方法重载允许多个同名方法通过不同参数列表共存,编译器依靠方法签名区分它们。递归通过自身调用来分治问题,但必须设定终止条件并逐步趋近,否则会导致栈溢出。以阶乘为例展示了递归实现,并提醒在冗余计算多时迭代更合适。

CryptoLab发布于 2026/6/3更新于 2026/8/2021 浏览
聊聊Java的方法:定义、重载与递归

方法是什么

反复写同一段逻辑,不仅拖慢进度,也让代码越来越难维护。把常用的功能封装成方法,需要时调用一次就好。这在Java里和C的函数差不多,只是它必须待在类里面。

一个方法能帮你做几件事:把复杂逻辑拆成小块,让代码更容易看懂;一次编写,到处调用;改bug时只动一处,不用满世界找重复片段。比如,判断一个数是不是素数,写成方法再在main里调用,就比每次都重写循环清爽得多。

public static void func(int a) {
    boolean flag = true;
    for (int i = 2; i <= a - 1; i++) {
        if (a % i == 0) {
            System.out.println(a + "不是素数");
            return;
        }
    }
    System.out.println(a + "是素数");
}

方法定义的语法

定义一个方法的完整样子:

修饰符 返回值类型 方法名称 ([参数类型 形参]) { 方法体代码; return 返回值; }

像上面的 public static void func(int a),public static 是修饰符,void 表示没有返回值,func 是方法名,参数列表里有一个 int 类型的形参 a。

写方法时需要注意几点:

  • 返回值类型必须和实际返回的数据一致;没有返回值就用 void。
  • 方法名用小驼峰,见名知意。
  • 方法只能定义在类里,不能嵌套定义。
  • 参数列表可以为空,需要参数时必须指定类型,多个参数用逗号分隔。

形参和实参的关系很容易踩坑。调用方法时,形参不过是实参的一个临时拷贝,它有自己的内存空间。你在方法里怎么折腾形参,都不会影响调用处的实参。比如写一个交换两个整数的 swap 方法,尽管里面把形参颠倒了,main 里的变量还是纹丝不动——因为传递的只是值的副本。这不奇怪,理解了值传递的机制就明白了。

方法重载

有时候你需要处理不同类型的数据,比如对两个整数相加,又想对两个浮点数相加,甚至三个整数相加。如果给每个版本都起不同的名字,调用的地方很容易搞混。Java 允许同一个类里出现多个同名方法,只要它们的参数列表不同——这就是方法重载。

方法重载的规则很简单:

  • 方法名必须一样。
  • 参数列表必须不同(个数、类型、顺序至少一项不同)。
  • 返回值类型无所谓,可以相同也可以不同。

那编译器怎么区分同名方法呢?靠的是方法签名。签名由方法全路径名、参数列表和返回值类型组合而成,编译后每个方法都有一个独一无二的内部名称,所以同一个类里可以安心定义多个 add。

递归是怎么回事

递归就是方法自己调用自己。'递'是不断把问题拆小,'归'是小到不能再拆时一层层往回返。它适合那种大问题能分解成结构相同、规模更小的子问题的场景。

递归用不好容易出事。比如写一个没有终止条件的 print 方法,它不停调用自己,很快就会抛出 StackOverflowError。所以写递归必须满足两个条件:

  1. 有一个明确的终止条件,到了那里就不再递推。
  2. 每次递归调用都让问题规模往终止条件靠拢。

经典例子:计算 n 的阶乘。

分析一下:5! = 5 × 4!,4! = 4 × 3!,以此类推,直到 0! = 1。于是得到公式:

n! = n × (n-1)!   (n > 0)
0! = 1

用代码实现就很直接:

public class Test10 {
    public static int Fact(int n) {
        if (n == 0) {
            return 1;
        }
        return n * Fact(n - 1);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println(Fact(n));
    }
}

递归虽然巧妙,但别盲目用。像阶乘这种简单问题,迭代往往更省资源,也避免了栈溢出的风险。递归用得不好,冗余计算多,性能反而下降。选择哪种方式,得看具体情况。

目录

  1. 方法是什么
  2. 方法定义的语法
  3. 方法重载
  4. 递归是怎么回事
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 主流 Computer Use Agent 项目汇总与 Agentic AI 技术解析
  • Android Framework 源码解析:AI 时代的挑战与学习路径
  • 低代码 AI 平台:Coze 与 Dify 深度对比
  • 基于 HTML/CSS/JS 的非遗守艺人网站开发实战
  • 平台、记忆、评测——AI 竞赛正在换挡
  • ETL 架构演进:从批处理到实时流处理实战
  • 大型语言模型数据合成与增强技术综述
  • AI 绘画在 Photoshop 中的实现:ComfyUI 插件集成指南
  • 大模型本地部署指南:基于 llama.cpp 在 CPU 上运行 LLaMA2
  • 宇树 G1 机器人开发入门:有线与无线连接配置
  • 知网 AIGC 检测未通过?三款降重工具实测分析
  • VS Code Copilot Chat 复制内容为何丢失 Markdown 格式
  • 从 _Generic 到 if constexpr:C/C++ 泛型复用实践
  • 企业私有 RAG 大模型构建:Qwen2.5 与 vLLM 部署实战
  • Git 连接 GitHub 失败:Failed to connect to github.com port 443
  • Python入门指南:什么是Python、为什么学Python、如何学习Python
  • OpenClaw 本地 AI 智能体部署与实战指南
  • AI 前端核心解析:技术差异、技能树与实战路径
  • 前端核心知识点梳理与面试复习
  • AI 驱动游戏:鸿蒙生态的机会在哪里?

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online