【Java】方法的使用 —— 语法要求、方法的重载和签名、方法递归

目录

1. 方法基础知识

1.1 方法的概念

1.2 语法格式

* 注意事项【与C不同】

1.3 return —— 返回值的严格检查【比C语言严格】

2. 形参与实参的关系

3. 方法重载

3.1 什么是方法重载?为什么要方法重载?

3.2 方法重载的规则

4. 方法签名

5. 递归


1. 方法基础知识

1.1 方法的概念

方法就是一个代码片段. 类似于 C 语言中的 "函数"。方法存在的意义(不要背, 重在体会):

  1. 是能够模块化的组织代码(当代码规模比较复杂的时候). 
  2. 做到代码被重复使用, 一份代码可以在多个位置使用. 
  3. 让代码更好理解更简单.
  4. 直接调用现有方法开发, 不必重复造轮子.

1.2 语法格式

方法的语法格式:

修饰符 返回值类型 方法名称 ( [参数类型 形参 ...] ){

         方法体代码;

        [return 返回值];

}

//修饰符要等我们学到类和对象才能讲解清楚,目前我们只需要写上“public static

例如:实现一个两个整数相加的方法

public class Method{// 加法方法的定义public static int add(int x, int y) {return x + y;}}

* 注意事项【与C不同】

1. 修饰符:现阶段直接使用public static 固定搭配【C语言没有修饰符】

2. 方法名字:采用小驼峰命名。【C语言没有这种默认习惯】 

3. 在java当中,方法必须写在类当中,即方法的定义必须在类的局部域。 (比如上面的加法方法,该方法就写在了Method类里)

【C语言中没有类的概念,函数定义要写在所有函数的外面,即在全局域上】

4. 方法不能嵌套定义【C语言也不允许函数嵌套定义】

5. java当中,没有方法的前置声明不过方法定义写在main方法后面也能使用(这也是类的优势)。

【C语言中,如果前面没写函数的定义,就需要在前面写上前置声明,否则就无法使用该函数】

[]不能前置声明:

[]方法定义写在main后:

1.3 return —— 返回值的严格检查【比C语言严格】

先说结论:(针对基础数据类型)

  1. 方法的返回值可以没有,没有时返回值类型必须写成void。否则系统会检查你是否有返回值,如果没有就会要求你完成返回语句return。【java方法定义中返回类型是必不可少的没有返回类型一定会报错;不像C语言,没有返回类型默认是返回int型】
  2. Java是一种强类型语言,因此有返回值时,返回值必须与声明的返回类型相同。eg:int型对应int型,long对应long,double对应double……
  3. 除非 返回值类型 < 返回类型,即它们可以发生隐式类型转换。eg:float(值)与double(返),short(值)与int(返)……

       

错误例子1:返回值类型是int > 返回类型是byte

错误例子2:返回值类型是double 与 返回类型是boolean 不相干


对于类类型和接口类型,还会涉及向上转型和向下转型。(这些知识会在 类与对象 以及 java数据 结构 中讲解,目前只是简单了解

自动装箱和拆箱:Java支持自动装箱和拆箱,这允许基本数据类型与其对应的包装类之间进行转换。例如:

public Integer getNumber() {return 42; // 自动装箱,将int类型的42转换为Integer对象
}

泛型方法:在泛型方法中,返回值的类型检查也遵循相同的规则。例如:

public <T> T getValue(T value) {return value; // 返回值类型与方法签名中的泛型类型一致
}

2. 形参与实参的关系

Java中方法的形参就相当于sum函数中的自变量n,用来接收sum函数在调用时传递的值的。形参的名字可以随意 取,对方法都没有任何影响,形参只是方法在定义时需要借助的一个变量,用来保存方法在调用时传递过来的值。

public static int add(int a, int b){return a + b;}add(2, 3);   // 2和3是实参,在调用时传给形参a和b

注意:实参的值永远都是拷贝到形参中,形参和实参本质是两个实体

代码示例: 交换两个整型变量

 public class TestMethod {public static void main(String[] args) {int a = 10;int b = 20;swap(a, b);System.out.println("main: a = " + a + " b = " + b);}public static void swap(int x, int y) {int tmp = x;x = y;y = tmp;System.out.println("swap: x = " + x + " y = " + y);}}// 运行结果
swap中: x = 20 y = 10
main中: a = 10 b = 20

在swap函数交换之后,形参x和y的值发生了改变,但是main方法中a和b还是交换之前的值,即没有交换成功。

【原因分析】

实参a和b是main方法中的两个变量,其空间在main方法的栈(一块特殊的内存空间)中,而形参x和y是swap方法中 的两个变量,x和y的空间在swap方法运行时的栈中,因此:实参a和b 与 形参x和y是两个没有任何关联性的变量, 在swap方法调用时,只是将实参a和b中的值拷贝了一份传递给了形参x和y,因此对形参x和y操作不会对实参a和b 产生任何影响。

总结:对于基础数据类型来说, 形参相当于实参的拷贝. 即传值调用

【java中没有指针,要做到传址调用就需要学习类和对象】

3. 方法重载

3.1 什么是方法重载?为什么要方法重载?

方法重载(Method Overloading)是Java中的一种重要特性,它允许在同一个类中定义多个同名的方法,但这些方法必须具有不同的参数列表。

至于“为什么要方法重载”,我们以加法器为例:

Java对于类型的检查比较严格,如果要写出加法的方法,一般来说我们要为int型数据设置一个方法addInt,为float型的数据设置方法addFloat,为long型的数据设置方法addLong……

这样做就很麻烦,于是Java中引入了方法重载的概念,于是不同数据类型的加法方法都可以用add来命名了。(虽然是共用一个名字,但是方法的详细定义是不同的)

3.2 方法重载的规则

如何构成重载:

  1. 方法名必须相同
  2. 参数列表必须不同(参数的个数、参数的类型、类型的次序,其中一个不同都算不同) 。【注意:参数名称不同 不算作 参数表不同,并不构成重载
  3. 返回类型是否相同无关
  4. 方法体是否相同无关
  • 决定性因素:参数表不同

编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法

错误例子1:参数名称不同

错误例子2:返回类型不同

错误例子3:方法体不同

正确示范:

4. 方法签名

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

这是因为有方法签名。

方法签名即:经过编译器编译修改过之后方法最终的名字,它用于唯一标识一个方法

具体方式:方法全路径名 + 参数列表 + 返回值类型,构成方法完整的名字。

(虽然返回类型不参与Java中方法的重载机制,但它是方法签名的一部分)

注意事项

  • 访问修饰符(如publicprivate等)和异常声明(如throws Exception)不属于方法签名的一部分。
  • 方法体也不属于方法签名的一部分,方法体是方法的具体实现。

以下是一些Java中的方法签名示例:

// 方法签名1: 无参数,无返回值
public void doSomething() {
}// 方法签名2: 一个int参数,无返回值
public void doSomething(int a) {
}// 方法签名3: 两个int参数,无返回值
public void doSomething(int a, int b) {
}// 方法签名4: 一个String参数,返回int
public int doSomething(String s) {return 0;
}// 方法签名5: 一个int参数,返回String
public String doSomething(int a) {return "";
}

在上面的例子中,每个方法都有不同的参数列表,因此它们具有不同的方法签名。即使方法名相同,只要参数列表不同,它们就是不同的方法。


方法签名与方法重载的关系:

  • 方法重载依赖于方法签名的不同:由于方法重载要求同名方法的参数列表必须不同,因此编译器可以通过比较方法签名来区分不同的重载方法。如果两个方法的方法名相同但参数列表不同,那么它们就具有不同的方法签名,从而可以构成重载关系。

总的来说,①方法签名用于唯一标识一个方法的关键要素,②而方法重载则是通过改变方法签名中的参数列表来实现的

5. 递归

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

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

递归的必要条件:

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

代码示例: 递归求 N 的阶乘

//main方法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;}// 执行结果
函数开始, n = 5
函数开始, n = 4
函数开始, n = 3
函数开始, n = 2
函数开始, n = 1
函数结束, n = 1 ret = 1
函数结束, n = 2 ret = 2
函数结束, n = 3 ret = 6
函数结束, n = 4 ret = 24
函数结束, n = 5 ret = 120ret = 120

注意事项

  • 一定要保证函数在各种情况下都有方法出口,否则会报错并要求你写上其他出口

【C语言中不强制要求每种情况下都有出口】

例如:


本期分享完毕,感谢大家的支持Thanks♪(・ω・)ノ

 

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

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

相关文章

鸿蒙开发:arkts Refresh 组件

基本概念 在 ArkTS 5.0 中&#xff0c;Refresh组件是用于实现下拉刷新功能的重要元素。它为用户提供了一种直观的方式来获取最新的数据。当用户在界面上对Refresh组件所在的区域进行下拉操作时&#xff0c;如果满足一定的触发条件&#xff0c;就会触发刷新事件&#xff0c;从而…

ClickHouse 神助攻:纽约城市公共交通管理(MTA)数据应用挑战赛

本文字数&#xff1a;13198&#xff1b;估计阅读时间&#xff1a;33 分钟 作者&#xff1a;The PME Team 本文在公众号【ClickHouseInc】首发 我们一向对开放数据挑战充满热情&#xff0c;所以当发现 MTA&#xff08;城市交通管理局&#xff09;在其官网发起了这样的挑战时&…

HarmonyOS开发5.0 net 启动界面设置

第一步、创建我们界面 第二步&#xff0c; 在EntryAbility中配置启动页面&#xff0c;在entry/src/main/ets/entryability/EntryAbility.ets中配置启动页面 配置如下 至此大功告成

算法笔记day10

目录 1.牛牛冲钻五 2.最长无重复子数组_牛客题霸_牛客网 3.重排字符串 1.牛牛冲钻五 算法思路&#xff1a; 特别简单的模拟题&#xff0c;没什么说的。 #include <iostream> #include <vector> #include <string> using namespace std; int main() { …

ETF申购赎回指南:详解注意事项与低费率券商推荐!

​ETF 申购&赎回 ETF申购赎回是个啥业务&#xff1f; 01 ETF申购、赎回是一种交易委托方式&#xff0c;指投资者通过申购方式(买入方向)获得ETF份额&#xff0c;通过赎回的方式&#xff08;卖出方向&#xff09;换掉/卖出ETF份额。ETF申购&#xff0c;通常是通过一篮子成…

LinkedList和链表之刷题课(下)

1. 给定x根据x把链表分割,大的结点放在x后面,小的结点放在x前面 题目解析: 注意此时的pHead就是head(头节点的意思) 基本上就是给定一个链表,我们根据x的值来把这个链表分成俩部分,大的那部分放在x后面,小的那部分放在x前面,并且我们不能改变链表本来的顺序,比如下面的链表,我…

UI 组件的二次封装

UI 组件的二次封装是指&#xff0c;在基础 UI 库的组件上进行自定义封装&#xff0c;以实现更贴合业务需求的功能和样式。通过二次封装&#xff0c;可以增强组件的复用性、便捷性和一致性&#xff0c;简化业务代码&#xff0c;同时降低后续维护成本。 1. 二次封装的原理 二次…

ELK + Filebeat + Spring Boot:日志分析入门与实践(二)

目录 一、环境 1.1 ELKF环境 1.2 版本 1.3 流程 二、Filebeat安装 2.1 安装 2.2 新增配置采集日志 三、logstash 配置 3.1 配置输出日志到es 3.2 Grok 日志格式解析 3.2 启动 logstash ​3.3 启动项目查看索引 一、环境 1.1 ELKF环境 springboot项目&#xff1a;w…

二百七十、Kettle——ClickHouse中增量导入清洗数据错误表

一、目的 比如原始数据100条&#xff0c;清洗后&#xff0c;90条正确数据在DWD层清洗表&#xff0c;10条错误数据在DWD层清洗数据错误表&#xff0c;所以清洗数据错误表任务一定要放在清洗表任务之后。 更关键的是&#xff0c;Hive中原本的SQL语句&#xff0c;放在ClickHouse…

一篇文章入门梅尔频率倒谱系数

文章目录 梅尔频率倒谱系数MFCC预处理预加重分帧加窗 FFT&#xff08;Fourier-Transform&#xff09;功率谱滤波器组梅尔频率倒谱系数&#xff08;MFCC&#xff09;均值归一化总结 参考文献 梅尔频率倒谱系数MFCC 梅尔倒谱系数&#xff08;Mel-scale FrequencyCepstral Coeffi…

Qt的信号槽机制学习一

一、Qt理论知识简记 &#xff08;一&#xff09;信号与槽[1] 信号与槽是Qt编程的基础&#xff0c;其使得处理界面上各个组件的交互操作变得比较直观和简单&#xff0c;GUI&#xff08;Graphical User Interface&#xff09;程序设计的主要工作就是对界面上各组件的信号进行相应…

程序员的相亲囧途:三万相亲费,能否换回真爱?

在快节奏的都市生活中&#xff0c;相亲已成为不少单身男女寻找另一半的重要途径。然而&#xff0c;宁波的唐先生却在这条路上遭遇了不小的挫折。28岁的他&#xff0c;身高1米78&#xff0c;本应是相亲市场上的“香饽饽”&#xff0c;却在“我主良缘”交了三万块钱相亲费后&…

【Android】使用TextView实现按钮开关代替Switch开关

介绍 Android 本身自己带的有开关控件&#xff0c;但是很多时候我们是不愿意使用这种开关的&#xff0c;感觉使用起来比较麻烦&#xff0c;特别是遇到需要延迟操作的情况。 比如有一个需求是这样的&#xff1a;我们需要打开一个设置&#xff0c;但是这个设置是否打开需要经过…

AI自媒体变现路径大盘点!建议收藏!

当下的我做为一人公司或者超级个体为目标的创业模式&#xff0c;无论是在写作、图文和短视频输出方面&#xff0c;我都是运用了N个AI工具来提升我的生产力。 这种创业模式就是一个人N个AI的模式&#xff0c;我们可以通过AI工具做提效来赚取差价&#xff0c;以时间复利来累计财…

Python的协程与传统的线程相比,是否能更有效地利用计算资源?在多大程度上,这种效率是可测量的?如何量化Python协程的优势|协程|线程|性能优化

目录 1. 协程与线程的基本概念 1.1 线程 1.2 协程 2. 协程的实现原理 2.1 基本示例 3. 协程与线程的效率对比 3.1 资源利用率 3.2 性能测试 4. 使用场景分析 4.1 适用场景 4.2 不适用场景 5. 性能监测与测量 5.1 使用时间记录 5.2 使用第三方库 6. 总结与展望 P…

服务器文件访问协议

服务器文件访问协议 摘要NFS、CIFS、SMB概述SMBWindows SMBLinux SambaPython SMB NFS 摘要 本篇博客参考网上文档和博客&#xff0c;对基于网络的服务器/主机的文件访问、共享协议进行简要总结&#xff0c;完整内容将会不断更新&#xff0c;以便加深理解和记忆 NFS、CIFS、S…

docker占用磁盘过多问题

我在windows系统上用docker&#xff0c;安装在C盘环境下&#xff0c;我发现C盘占用了大量的空间&#xff0c;查找后发现是docker的映像文件占用的&#xff0c;于是开始清理&#xff0c;中间还踩个坑&#xff0c;记录一下&#xff0c;下次需要的时候方便找。 踩坑 我本想移动映…

HarmonyOS:@Watch装饰器:状态变量更改通知

Watch应用于对状态变量的监听。如果开发者需要关注某个状态变量的值是否改变&#xff0c;可以使用Watch为状态变量设置回调函数。 说明 从API version 9开始&#xff0c;该装饰器支持在ArkTS卡片中使用。 从API version 11开始&#xff0c;该装饰器支持在元服务中使用。 一、概…

【Qt】控件——布局管理器、常见的布局管理器、布局管理器的使用、垂直布局、水平布局、网格布局、表单布局、Spacer

文章目录 Qt布局管理器垂直布局水平布局网格布局表单布局Spacer Qt 布局管理器 之前在使用 Qt 创建界面上的控件时&#xff0c;大多是通过 “绝对定位” 的方式来设定的。即每个控件所在的位置都需要计算坐标&#xff0c;最终通过 setGeometry 或者 move 方式进行摆放。 然而&a…

配置和排查 Lombok 在 IDEA 中使用的详细步骤

在日常开发中&#xff0c;Java 代码常常需要大量的样板代码&#xff0c;比如 getter、setter、toString 等方法。Lombok 是一个 Java 库&#xff0c;可以通过注解的方式&#xff0c;自动生成这些常见的代码&#xff0c;从而让代码更加简洁、清晰。比如&#xff0c;我们可以通过…