【JAVASE】重载与递归

news2024/11/14 11:40:38

⭐ 作者:小胡_不糊涂
🌱 作者主页:小胡_不糊涂的个人主页
📀 收录专栏:浅谈java
💖 持续更文,关注博主少走弯路,谢谢大家支持 💖

重载与递归

  • 1. 方法重载
    • 1.1 为什么需要方法重载
    • 1.2 方法重载的概念
    • 1.3 方法签名
  • 2. 递归
    • 2.1 递归的概念
    • 2.2 执行过程分析
    • 2.4 递归练习

1. 方法重载

1.1 为什么需要方法重载

大家看下面这段代码:

public static void main(String[] args) {
        int a = 10;
        int b = 20;
        int ret = add(a, b);
        System.out.println("ret = " + ret);
        double a2 = 10.5;
        double b2 = 20.5;
        double ret2 = add(a2, b2);
        System.out.println("ret2 = " + ret2);
    }
    public static int add(int x, int y) {
        return x + y;
     }

编译错误:在计算 ret2 时,传送的实参类型与 add 方法的类型不一样
在这里插入图片描述
由于参数类型不匹配,所以不能直接使用现有的 add 方法。
一种比较简单粗暴的解决方法如下:

public static void main(String[] args) {
        int a = 10;
        int b = 20;
        int ret = addInt(a, b);
        System.out.println("ret = " + ret);
        double a2 = 10.5;
        double b2 = 20.5;
        double ret2 = addDouble(a2, b2);
        System.out.println("ret2 = " + ret2);
    }
    public static int addInt(int x, int y) {
        return x + y;
    }
    public static double addDouble(double x, double y) {
        return x + y;
    }

上述代码确实可以解决问题,但不友好的地方是:需要提供许多不同的方法名,而取名字本来就是让人头疼的事情。

那能否将所有的名字都给成 add 呢?

1.2 方法重载的概念

在自然语言中,一个词语如果有多重含义,那么就说该词语被重载了,具体代表什么含义需要结合具体的场景。
在Java中方法也是可以重载的。

在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了。

例如:

 public static void main(String[] args) {
        System.out.println(add(1, 2)); // 调用add(int, int)
        System.out.println(add(1.5, 2.5)); // 调用add(double, double)
        System.out.println(add(1.5, 2.5, 3.5)); // 调用add(double, double, double)
    }
    public static int add(int x, int y) {
        return x + y;
    }
    public static double add(double x, double y) {
        return x + y;
    }
    public static double add(double x, double y, double z) {
        return x + y + z;
    }

🍤 运行结果:

在这里插入图片描述

重载的注意事项:

  • 方法名必须相同
  • 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)
  • 与返回值类型是否相同无关(返回值不作为判断重载的条件)
  • 编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法
// 注意:两个方法如果仅仅只是因为返回值类型不同,是不能构成重载的
 public static void main(String[] args) {
        int a = 10;
        int b = 20;
        int ret = add(a, b);
        System.out.println("ret = " + ret);
    }
    public static int add(int x, int y) {
        return x + y;
    }
    public static double add(int x, int y) {
        return x + y;
    }
// 编译出错
错误: 已在类中定义了方法 add(int,int)
public static double add(int x, int y) {

1.3 方法签名

在同一个作用域中不能定义两个相同名称的标识符。
比如:方法中不能定义两个名字一样的变量,那为什么类中就可以定义方法名相同的方法呢?

方法签名:经过编译器编译修改过之后方法最终的名字。
具体方式:方法全路径名+参数列表+返回值类型,构成方法完整的名字。

方法签名中的一些特殊符号说明:

特殊字符数据类型
Vvoid
Zboolean
Bbyte
Cchar
Sshort
Iint
Jlong
Ffloat
Ddouble
[数组(以 [ 开头,配合其他的特殊字符,表述对应数据类型的数组,有几个 [ ,就表示几维数组)
L引用类型,以 L 开头,以 ; 结尾,中间是引用类型的全类名

🍩编译器层面分别重载就是根据方法签名

2. 递归

2.1 递归的概念

一个方法在执行过程中调用自身,就称为 “递归”。
递归相当于数学上的“数学归纳法”,有一个起始条件,然后有一个递推公式。

例如, 我们求 N!
起始条件:N = 1 的时候,N! 为 1。 这个起始条件相当于递归的结束条件。
递归公式:求 N! , 直接不好求,可以把问题转换成 N! => N * (N-1)!

递归的必要条件:

  • 将原问题划分成其子问题,注意:子问题必须要与原问题的解法相同
  • 递归出口

实例: 递归求 N 的阶乘

 public static void main(String[] args) {
        int n = 5;
        int ret = factor(n);//调用方法
        System.out.println("ret = " + ret);//输出
    }
    public static int factor(int n) {
        if (n == 1) {		//结束条件
            return 1;
        }
        return n * factor(n - 1); // factor 调用函数自身
    }

🍤 运行结果:

在这里插入图片描述

2.2 执行过程分析

递归的程序的执行过程不太容易理解,要想理解清楚递归,必须先理解清楚 “方法的执行过程”,尤其是 "方法执行结束之后,回到调用位置继续往下执行。

实例:递归求 N 的阶乘

 public static void main(String[] args) {
        int n = 5;
        int ret = factor(n);
        System.out.println("ret = " + ret);
    }
    public static int factor(int n) {
        System.out.println("函数开始, n = " + n);
        if (n == 1) {
            System.out.println("函数结束, n = 1 ret = 1");
            return 1;
        }
        int ret = n * factor(n - 1);
        System.out.println("函数结束, n = " + n + " ret = " + ret);
        return ret;
    }

🍤 运行结果:

在这里插入图片描述
执行过程图:

在这里插入图片描述

2.4 递归练习

实例1 :按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)

public static void main(String[] args) {
        print(1234);
    }
    public static void print(int num) {
        if (num > 9) {
            print(num / 10);
        }
        System.out.println(num % 10);
    }

🍤 运行结果:

在这里插入图片描述

实例2:写一个递归方法,输入一个非负整数,返回组成它的数字之和. 例如,输入 1729, 则应该返回 1+7+2+9,它的和是19

  public static void main(String[] args) {
        System.out.println(sum(1297));
    }
    public static int sum(int num) {
        if (num < 10) {
            return num;
        }
        return num % 10 + sum(num / 10);
    }

🍤 运行结果:

在这里插入图片描述

实例3:求斐波那契数列的第 N 项

public static void main(String[] args) {
        System.out.println(fib(5));
    }
    public static int fib(int n) {
        if (n == 1 || n == 2) {
            return 1;
        }
        return fib(n - 1) + fib(n - 2);
    }

🍤 运行结果:

在这里插入图片描述


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/818976.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源代码分享(9)—面向100%清洁能源的发输电系统扩展规划(附matlab代码)

1.背景介绍 1.1摘要 本文提出了一种新颖的建模框架和基于分解的解决策略&#xff0c;将随机规划&#xff08;SP&#xff09;和鲁棒优化&#xff08;RO&#xff09;相结合&#xff0c;以应对协调中长期电力系统规划中的多重不确定性。从独立系统运营商&#xff08;ISO&#xff…

CAD曲面建模

首先还是要在3d绘图的环境中进行 在网络菜单栏的左侧&#xff0c;有曲面建模相关的功能 包括旋转形成曲面、平移形成曲面&#xff0c;按照两条线形成网格&#xff0c;按照四条封闭的线形成曲面等等 首先演示旋转曲面 需要被旋转的对象&#xff0c;以及旋转轴 首先选择要旋转…

Leetcode | DP | 338. 198. 139.

338. Counting Bits 重点在于这张图。 从i1开始&#xff0c;dp的array如果i是2的1次方之前的数&#xff0c;是1 dp[i - 2 ^ 0]; 如果i是2的2次方之前的数&#xff0c;是1 dp[i - 2 ^ 1]; 如果i是2的3次方之前的数&#xff0c;是1 dp[i - 2 ^ 2]; 198. House Robber 如果…

Hadoop学习指南:探索大数据时代的重要组成——Hadoop运行模式(下)

Hadoop运行模式(下&#xff09; 前言2.6 配置历史服务器1&#xff09;配置mapred-site.xml2&#xff09;分发配置3&#xff09;在hadoop102启动历史服务器4&#xff09;查看历史服务器是否启动5&#xff09;查看JobHistory 2.7 配置日志的聚集1&#xff09;配置yarn-site.xml2&…

【ChatGPT辅助学Rust | 基础系列 | Rust初相识】Rust简介与环境配置

教程目录 前言一&#xff0c;Rust简介1&#xff0c;Rust的历史2&#xff0c;Rust的特性3&#xff0c;为什么选择Rust4&#xff0c;Rust可以做什么 二&#xff0c; Rust环境配置1&#xff0c;windows11安装2&#xff0c;Linux安装 三&#xff0c;安装IDE 前言 Rust是一种系统编…

智慧水务配电能效系统的开发与功能介绍

随着城市化进程的步伐大大变快&#xff0c;城市建设与科学信息技术的融合程度也在不断提升&#xff0c;尤其是大数据信息技术的迅猛发展&#xff0c;为民生工程由信息化向智能化转型提供了条件。以城市的水务系统为例&#xff0c;依托大数据信息技术构建智慧水务系统是智慧城市…

从 DejaVu 改为 Noto,Ubuntu 23.10 发行版计划调整字体包

近日消息&#xff0c;代号为“Mantic Minotaur”的 Ubuntu 23.10 发行版计划调整字体包&#xff0c;从 DejaVu 修改为 Noto。 近日消息&#xff0c;代号为“Mantic Minotaur”的 Ubuntu 23.10 发行版计划调整字体包&#xff0c;从 DejaVu 修改为 Noto。 Ubuntu 开发团队表示为…

数字人第一剑,先斩“尹天仇”

第一波被数字人抢走饭碗的人类&#xff0c;不是带货主播&#xff0c;也不是虚拟偶像&#xff0c;而是好莱坞的群演们。 过去几个月&#xff0c;数千名好莱坞演员罢工&#xff0c;并出现在Netflix奈飞、华纳兄弟、Discovery、亚马逊、派拉蒙和NBC环球的办公大楼示威。 此次好莱坞…

哈工大计算机网络课程网络安全基本原理详解之:密钥分发中心与公钥认证中心

哈工大计算机网络课程网络安全基本原理详解之&#xff1a;密钥分发中心与公钥认证中心 在介绍密钥分发中心的概念前&#xff0c;先来回顾一下之前介绍的身份认证协议AP4.0&#xff1a;利用随机数R来避免“回放攻击”&#xff0c;并借助于对称加密算法来保证R的加密传输和解密&…

用python编写一个小程序,如何用python编写软件

大家好&#xff0c;给大家分享一下用python编写一个小程序&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 1、python可以写手机应用程序吗&#xff1f; 我想有人曲解意思了&#xff0c;人家说用python开发渣蔽一个手机app&#xff0c;不是…

“ARTS挑战:探索技术,分享思考“

文章目录 前言一、学习的内容二、遇到的困难及解决办法三、学习打卡成果展示四、学习技巧的总结五、未来学习打卡计划后记 关于 ARTS 的释义 ● Algorithm: 每周至少做一个 LeetCode 的算法题 ● Review: 阅读并点评至少一篇英文技术文章 ● Tips: 学习至少一个技术技巧 ● Sha…

大数据面试实际场景类问题怎么准备,实在遭不住了!

300万字&#xff01;全网最全大数据学习面试社区等你来&#xff01; 前几天我发了一个面试总结的文章&#xff0c;实际场景类问题在大数据领域面试的占比越来越多。大家面试开始「务实」&#xff0c;在实际场景问题中&#xff0c;顺便增加对框架原理性内容的考察&#xff0c;这…

Docker中gitlab以及gitlab-runner的安装与使用

1、本文主要讲述如何使用Docker安装gitlab以及gitlab-runner&#xff0c;并且会讲述gitlab-runner如何使用 2、gitlab部分不需要修改过多的配置即可使用&#xff0c;本文未讲述https配置&#xff0c;如有需求&#xff0c;可自行百度 3、Docker如何安装可以自行百度 一、Docker安…

react中的高阶组件理解与使用

一、什么是高阶组件&#xff1f; 其实就是一个函数&#xff0c;参数是一个组件&#xff0c;经过这个函数的处理返回一个功能增加的组件。 二、代码中如何使用 1&#xff0c;高级组件headerHoc 2&#xff0c;在普通组件header中引入高阶组件并导出高阶组件&#xff0c;参数是普…

linux备份与还原系统(类似window上ghost备份还原)

一、摘要 在linux上进行了几年的开发工作 &#xff08;qt ros&#xff09; 突然发现&#xff0c;现在有公司硬件、笔记本台式机一台占一个系统&#xff0c;导致硬件太浪费&#xff0c;又不能用虚拟机&#xff08;有时候要链接硬件必须物理机&#xff09;怎么办&#xff1f; 二…

Simple Set Problem

题意&#xff1a; 给你k个集合&#xff0c;每个集合里有ci个数&#xff0c;在每个集合里各挑一个数&#xff0c;求挑的k个数里的最大值减去最小值的值最小 思路&#xff1a; 可以将题意转换为&#xff0c;挑的所有数的集合一共有n种&#xff0c;求挑的数的最大值最小值的差最…

idealC-2020.1.4免费下载(附安装教程)

下载地址 [软件名称]: IntelliJ IDEA 2020 [软件大小]: 560MB [安装环境]: Windows [下载链接]: 链接: https://pan.baidu.com/s/1yGOWqfRVE6cPsAe0qHpnbg https://pan.baidu.com/s/1yGOWqfRVE6cPsAe0qHpnbg 提取码: zt88 软件介绍 idea 2020.是由捷克IntelliJ公司而…

快速响应,上门维修小程序让您享受无忧生活

随着科技的不断发展和智能手机的普及&#xff0c;上门维修小程序成为了现代人生活中越来越重要的一部分。上门维修小程序通过将维修服务与互联网相结合&#xff0c;为用户提供了更加便捷、高效的维修服务体验。下面将介绍上门维修小程序开发的优势。   提供便捷的预约方式&am…

NFTScan | 07.24~07.30 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。周期&#xff1a;2023.07.24~ 2023.07.30 NFT Hot News 01/数据&#xff1a;Azuki 地板价跌破 5 枚 ETH&#xff0c;过去 7 日跌幅逾 20% 7月24日&#xff0c; Blur数据显示&#xff0c;Azuki地板价已跌破…

开关降压型DC-DC芯片方案:30V-80V转24V/12V/5V芯片

摘要&#xff1a;本文介绍了一种开关降压型DC-DC芯片方案&#xff0c;可将输入电压范围在9V至100V之间的信号转换为24V、12V和5V输出。该芯片采用了外挂MOS管&#xff0c;能够提供10A峰值电流输出&#xff0c;并且具备低待机功耗、内置过温保护和输出短路保护等功能。此外&…