当前位置: 首页 > news >正文

Java——方法

文章目录

  • 什么是方法
  • 方法的定义
  • 方法的调用
    • 形参改变不会影响实参的值
  • 用方法求某个数的阶乘
  • 方法重载(overload)
  • 方法练习
    • 题目一:
    • 题目二:求和的重载
    • 题目三:求最大值方法的重载
    • 题目四:递归求汉诺塔问题

什么是方法

方法就是一个代码片段,类似于 C 语言中的 “函数”。
方法存在的意义:

  • 是能够模块化的组织代码(当代码规模比较复杂的时候)

  • 做到代码被重复使用, 一份代码可以在多个位置使用

  • 让代码更好理解更简单

  • 直接调用现有方法开发, 不必重复造轮子
    在编程中,某段功能的代码可能频繁使用到,如果在每个位置都重新实现一遍,会:

    • 使程序变得繁琐
    • 开发效率低下,做了大量重复性的工作
    • 不利于维护,需要改动时,所有用到该段代码的位置都需要修改
    • 不利于复用

    因此,在编程中,我们可以将频繁使用的代码封装方法,需要时直接拿来使用即可,避免了一遍一遍的累赘。


方法的定义

方法语法格式:

//方法定义
修饰符  返回值类型  方法名称(形式参数列表){方法体;
}

示例一:
实现一个方法,检测一个年份是否位闰年

  • 首先写方法的修饰符public static

  • 其次就是返回值类型,我们要检测一个年份是否为闰年,那么返回值类型就用boolean
    所以目前完整写为:public static boolean

  • 检测一个年份是否为闰年,那么方法名称就取为isLeapYearleap year的中文意思是闰年。
    目前完整写为:public static boolean isLeapYear

  • 要检测一个年份是否为闰年,那么年份就作为参数,写为:public static boolean isLeapYear(int year){方法体;}在这里插入图片描述
    注意:IDEA有个特点,当方法上写了返回值类型boolean后,如果没有return(返回值),那么下面括号的波浪线会一直提示没有return,加上个return false(返回值)就可以了
    在这里插入图片描述

  • 我们在isLeapYear方法中加上一些信息,然后执行程序
    在这里插入图片描述
    在这里插入图片描述
    发现程序什么也没有执行,这是因为程序是执行main方法,而此时main方法里什么也没有,所以什么也不会执行。

  • 我们该怎么使isLeapYear方法运行呢?


方法的调用

这就是方法的调用。
main方法中写isLeapYear方法,再给个参数2008。此时运行程序就会调用isLeapYear方法,打印方法被调用...在这里插入图片描述
我们将判断年份的代码补齐
闰年的判断方法:

  • 普通年份:能被4整除但不能被100整除的年份为闰年。例如:2004年能被4整除,且不能被100整除,所以是闰年;而1900年能被4整除,但也能被100整除,所以不是闰年。
  • 世纪年份:能被400整除的年份是闰年。比如:2000年能被400整除,是闰年。

在这里插入图片描述
在这里插入图片描述
以上就是闰年代码的判断。
注意事项:

  • 修饰符:现阶段直接使用public static这个固定搭配
  • 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致;如果没有返回值,必须写成void
  • 方法名字:采用小驼峰命名
  • 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
  • 方法体:方法要执行的语句
  • 在Java中,方法必须要写在类中
    在这里插入图片描述
    在这里插入图片描述
  • 在Java中,方法不能嵌套定义
  • 在Java中,没有方法声明一说在这里插入图片描述
  • 定义方法的时候,不会执行方法的代码,只有调用的时候才会执行
  • 一个方法可以被多次调用

总结,执行过程为:
程序走起来后先找到main方法,若main方法中有其他的方法,则调用方法——传递参数——找到方法地址——执行被调方法的方法体——被调方法结束返回——回到主调方法继续往下执行

再写段代码:实现两个整数相加的方法。
同样的:
修饰符public static
返回值类型int
方法名称add
形式参数列表(int x,int y)
最后再加上方法体。

public static int add(int x,int y){return x+y;
}

在这里插入图片描述


形参改变不会影响实参的值

写段代码
在这里插入图片描述
再修改一下代码:
在这里插入图片描述
此时实参与形参都是year,它们是否一样呢?
当然是不一样的,在main方法里的实参year2008,而isLeapYear方法里的形参year是实参赋给它的值,为2008
在这里插入图片描述
main方法里的值给到isLeapYear,修改isLeapYear方法里的year是不会影响到main方法里面的year

写段代码验证:
在这里插入图片描述
这段代码中func方法已经将year的值修改为100,但是最终打印出来的值仍是2008
这是因为在func方法中修改的是形参的值,相当于将2008改成了100在这里插入图片描述
任何方法执行完后栈帧都会被销毁掉,所以当回到main方法栈帧中去打印year的时候还是2008
在这里插入图片描述

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

再写段代码举例,我们写个方法可以实现两个整数交换
在这里插入图片描述
根据结果可知,x,y仍然是10与20,并没有交换。这是因为交换的是形参的a和ba和b原本分别是10与20,交换后a变成了20b变成了10


用方法求某个数的阶乘

在这里插入图片描述
这段代码中fac方法的作用是求某个数字的阶乘,再通过sum+=fac(i)将每个数字的阶乘相加。

用方法来组织内容可以将代码模块化,这个模块就是用来求每个数字的阶乘的,这就是方法的好处


方法重载(overload)

为什么需要方法重载呢?
我们写个可以实现两个整数相加的方法
在这里插入图片描述
我们再加上两个double类型的数据
在这里插入图片描述
此时就不可以使用add方法了,因为add方法本身要接收的是int类型的数据,编译器会报错: 从double转换到int可能会有损失。
我们为了两个double类型的数据也可以相加:将原本整型相加的方法改成addInt,再写个方法叫addDouble用来计算double类型的数据相加
在这里插入图片描述
上述代码确实可以解决问题,但是不友好的是:需要提供许多不同的方法名,而取名字本来就是让人头疼的事情。那能否将所有的名字都给成add 呢?
这就有了方法重载的概念。在自然语言中,一个词语如果有多重含义,那么就说该词语被重载了,具体代表什么含义需要结合具体的场景。

例如“好人这一概念”:你帮老爷爷过马路可以说你是好人;你对喜欢的女孩子表白,对方说“对不起,其实你是一个好人…”

在Java中方法也是可以重载的。
在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了
我们将这两种方法的名字都改成add,即这两种方法被重载了(前提:方法名相同,参数列表不同)
在这里插入图片描述
我们敲出add时就会有具体选择,想调用谁就选择谁
在这里插入图片描述
我们再写个add方法
在这里插入图片描述
此时这三个就是互为方法的重载。
我们可以观察出以下特点:

  • 方法名必须一样

  • 参数列表必须不一样(形参的个数、形参的类型、形参的顺序)
    例如我们再写一个add,都是三个参数,形参类型每对也一样,参数列表一模一样,就会报错,不构成重载
    在这里插入图片描述
    但把位置改一下,虽然都还是三个参数,但是第二对形参类型不一样,此时就不报错了,构成重载
    在这里插入图片描述
    注意:这种情况下会报错,不构成重载
    在这里插入图片描述
    在这里插入图片描述

  • 与返回值类型是否相同无关
    这两个方法的返回值都是int,构成重载
    在这里插入图片描述
    这三种方法的返回值不相同,也构成重载
    在这里插入图片描述
    所以方法返回值不论一样还是不一样,对构成重载不影响。我们主要看方法名和参数列表。

此时这4个add构成了方法的重载,虽然都叫add,但每个表达的意思不一样
在这里插入图片描述

总结:只要方法名一样,参数列表不一样,就构成重载


方法练习

题目一:

创建方法求两个数的最大值max2,随后再写一个求3个数的最大值的函数max3。要求:在max3这个函数中,调用max2函数,来实现3个数的最大值计算。

public static int max2(int a,int b){return a>b ? a:b;
}
public static int max3(int a,int b,int c){int max=max2(a,b);int ret=max2(max,c);return ret;
}
public static void main(String[] args) {System.out.println(max3(1, 2, 3));
}

题目二:求和的重载

在同一个类中,分别定义求两个整数的方法 和 三个小数之和的方法。并执行代码,求出结果

public static int add(int a,int b){return a+b;}public static double add(double a,double b,double c){return a+b+c;}public static void main(String[] args) {System.out.println("计算两个整数的和:");int ret1=add(2,3) ;System.out.println(ret1);System.out.println("计算三个小数的和:");double ret2=add(1.0,2.0,3.0) ;System.out.println(ret2);}

题目三:求最大值方法的重载

题目内容:在同一个类中定义多个方法:要求不仅可以求2个整数的最大值,还可以求3个小数的最大值

public static int max(int a,int b){return a>b ? a:b;}public static double max(double a,double b){return a>b ? a:b;}public static double max(double a,double b,double c){double max=max(a,b);double ret=max(max,c);return ret;}public static void main(String[] args) {System.out.println("求两个整数的最大值:");int ret1=max(5,8);System.out.println(ret1);System.out.println("求三个小数的最大值:");double ret2=max(2.1,2.2,2.3);System.out.println(ret2);}

题目四:递归求汉诺塔问题

http://www.lryc.cn/news/606100.html

相关文章:

  • 基于R语言地理加权回归、主成份分析、判别分析等空间异质性数据分析实践技术应用
  • EEG手工特征提取总结
  • RagFlow本地源码部署(非Docker)
  • 现在有哪些广泛使用的时序数据库?
  • AWS高级解决方案架构师黄海波:GenAI 时代非结构化数据处理的实践与趋势洞察
  • Linux性能检测与调优
  • 解决SparkSQL创建出来的数据库hive中无法识别的问题
  • 切割液性能智能调控系统与晶圆 TTV 预测模型的协同构建
  • toFixed()方法的报错注意
  • Python 程序设计讲义(47):组合数据类型——字典类型:创建字典
  • MySQL常用函数总结
  • 2025年7月最新一区SCI-基尔霍夫定律优化算法Kirchhoff’s law algorithm-附Matlab免费代码
  • [硬件电路-109]:模拟电路 - 自激振荡器的原理,一种把直流能量转换成交流信号的装置!
  • 专题:2025半导体行业研究报告:从AI芯片到封测突围的生死局|附40+份报告PDF、数据汇总下载
  • Apifox 7 月更新|通过 AI 命名参数及检测接口规范、在线文档支持自定义 CSS 和 JavaScript、鉴权能力升级
  • 鸿蒙拉起系统定位和app授权定位
  • 光伏热斑误检率↓79%!陌讯多模态融合算法在智慧能源的落地优化
  • 当文档包含图文混排表格时,如何结合大模型(如DeepSeek-VL)和OCR提取数据
  • 一次 web 请求响应中,通常那个部分最耗时?
  • Flutter module 是如何被原生 Android 项目通过 Gradle 引入的
  • Flutter Chen Generator - yaml配置使用
  • 原生安卓与flutter混编的实现
  • 是否需要买一个fpga开发板?
  • 嵌入式硬件学习(十)—— LED驱动+杂项设备驱动
  • 【Unity】实现小地图
  • TDengine 中 TDgp 中添加算法模型(异常检测)
  • 【大模型理论篇】跨语言AdaCOT
  • Flutter 页面跳转及传参总结
  • 8.2-使用字符串存储 UTF-8 编码文本
  • RAG:让AI更聪明的“外接大脑“ | AI小知识