【JavaSE】方法的使用
方法的使用
- BIT-5-方法的使用
- 绪论
- 1. 方法概念及使用
- 1.1什么是方法
- 1.2 方法定义
- 1.3 实参和形参的关系(重要)
- 1.4 没有返回值的方法
- 2. 方法重载
- 2.1 为什么需要方法重载
- 2.2 方法重载概念
- 3. 递归
- 3.1 生活中的故事
- 3.2 递归的概念
- 3.2 递归执行过程分析
- 3.3 递归练习
BIT-5-方法的使用
【本节目标】
-
掌握方法的定义以及使用
-
掌握方法传参
-
掌握方法重载
-
掌握递归
绪论
在编程中也是一样,某段功能的代码可能频繁使用到,如果在每个位置都重新实现一遍,会:
-
使程序变得繁琐
-
开发效率低下,做了大量重复性的工作
-
不利于维护,需要改动时,所有用到该段代码的位置都需要修改
-
不利于复用
因此,在编程中,我们也可以将频繁使用的代码封装成"函数"(方法),需要时直接拿来链接(即方法名–方法的入口地址)使用即可,避免了一遍一遍的累赘。
1. 方法概念及使用
1.1什么是方法
方法就是一个代码片段. 类似于 C 语言中的 “函数”。方法存在的意义(不要背, 重在体会):
-
是能够模块化的组织代码(当代码规模比较复杂的时候).
-
做到代码被重复使用, 一份代码可以在多个位置使用.
-
让代码更好理解更简单.
-
直接调用现有方法开发, 不必重复造轮子.
比如:在日历程序中经常要判断一个年份是否为闰年,则有如下重复性代码:
int year = 1900;
if((0 == year % 4 && 0 != year % 100) || 0 == year % 400){System.out.println(year+"年是闰年");
}else{System.out.println(year+"年不是闰年");
}
那么如何把重复性的代码封装成方法呢?
1.2 方法定义
方法语法格式
// 方法定义
修饰符 返回值类型 方法名称([参数类型 形参 ...]){方法体代码;[return 返回值];
}
public static 返回值 方法名(形式参数列表) {方法体;
}
public static void main(String[] args) {}
示例一:实现一个函数,检测一个年份是否为闰年
public static boolean isLeapYear(int year) {if((0 == year % 4 && 0 != year % 100) || 0 == year % 400){return true;}else{return false;}
}public static void main(String[] args) {boolean ret = isLeapYear(2020);System.out.println(ret);
}
方法名采取小驼峰的方式
实参和形参要一一匹配
返回值要和接收类型匹配
示例二: 实现一个两个整数相加的方法
public static int add(int a,int b) {return a+b;
}public static void main(String[] args) {int sum = add(2,3);System.out.println(sum);
}
在Java当中函数的定义位置没有要求,C语言当中一般从上到下。
代码示例: 计算 1! + 2! + 3! + 4! + 5!
public static int fac(int i) {int fac = 1;for (int j = 1; j <= i ; j++) {fac *= j;}return fac;
}public static void main(String[] args) {Scanner scan = new Scanner(System.in);int num = scan.nextInt();int sum = 0;for (int i = 1; i <= num ; i++) {//计算i的阶乘sum += fac(i);}System.out.println(sum);
}
【注意事项】
-
修饰符:现阶段直接使用public static 固定搭配
-
返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成void
-
方法名字:采用小驼峰命名
-
参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
-
方法体:方法内部要执行的语句
-
在java当中,方法必须写在类当中
-
在java当中,方法不能嵌套定义
-
在java当中,没有方法声明一说
补充
在多个.c文件当中只能有一个main函数,在多个.java文件当中可以有多个main函数。
1.3 实参和形参的关系(重要)
代码示例: 交换两个整型变量
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还是交换之前的值,即没有交换成功。
原因;形参是实参的一份临时拷贝,对形参的改变,不影响实参。
而Java当中并没有指针,所以关于交换数字的解决办法,我们后期学习了类和对象之后,才能解决这个问题。
1.4 没有返回值的方法
方法的返回值是可选的. 有些时候可以没有的,没有时返回值类型必须写成void
代码示例
class Test {public static void main(String[] args) {int a = 10;int b = 20;print(a, b);}public static void print(int x, int y) {System.out.println("x = " + x + " y = " + y);}
}
另外, 如刚才的交换两个整数的方法, 就是没有返回值的
2. 方法重载
2.1 为什么需要方法重载
public static int sumInt(int a,int b) {return (a+b);
}
public static void main(String[] args) {int sum1 = sumInt(1,2);System.out.println(sum1);double sum2 = sumInt(1.5,2.5);System.out.println(sum2);
}
//Java编译器会报错
//不兼容的类型: 从double转换到int可能会有损失
由于参数类型不匹配, 所以不能直接使用现有的 add 方法.
一种比较简单粗暴的解决方法如下:
public static int sumInt(int a,int b) {return (a+b);
}
public static double sumDou(double a,double b) {return (a+b);
}
public static void main(String[] args) {int sum1 = sumInt(1,2);System.out.println(sum1);double sum2 = sumDou(1.5,2.5);System.out.println(sum2);
}
上述代码确实可以解决问题,但不友好的地方是:需要提供许多不同的方法名,而取名字本来就是让人头疼的事
情。那能否将所有的名字都给成add呢?
答案是可以的,Java当中允许方法名相同,在调用方法的时候会根据传递的参数类型匹配不同的方法。
java当中可以取相同的名字会根据传递的参数,调用对应的方法。
但是不能方法名和形式列表内容完全相同
代码如下
public static int sum(int a,int b) {return (a+b);
}
public static int sum(int a,int b,int c) {return (a+b+c);
}
public static double sum(double a,double b) {return (a+b);
}
public static void main(String[] args) {int sum1 = sum(1,2);System.out.println(sum1);double sum2 = sum(1.5,2.5);System.out.println(sum2);
}
2.2 方法重载概念

在自然语言中,一个词语如果有多重含义,那么就说该词语被重载了,具体代表什么含义需要结合具体的场景。
在Java中方法也是可以重载的。
在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了。

注意:
-
方法名必须相同
-
参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)
-
与返回值类型是否相同无关
-
和参数的类型名无关

- 编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法
补充:
public class Test {public static int add(int a,int b){return a+b;}public static int add(int a,int b,int c){return a+b+c;}public static int add(int... arr){int sum = 0;for (int i = 0; i < arr.length; i++) {sum += arr[i];}return sum;}public static void main(String[] args) {System.out.println(add(1, 2, 3, 4));}
}
//打印
10
这里的int... arr与int[] arr类似
我们把int... arr这样的参数称为可变参数,但是这样代码的可读性降低,我们一般不这样写。
6.作业+递归+数组
3. 递归
3.1 生活中的故事
从前有坐山,山上有座庙,庙里有个老和尚给小和尚将故事,讲的就是:
"从前有座山,山上有座庙,庙里有个老和尚给小和尚讲故事,讲的就是:
“从前有座山,山上有座庙…”
“从前有座山……”
上面的故事有个特征:自身中又包含了自己,该种思想在数学和编程中非常有用,因为有些时候,我们遇到的问题直接并不好解决,但是发现将原问题拆分成其子问题之后,子问题与原问题有相同的解法,等子问题解决之后,原问题就迎刃而解了。
3.2 递归的概念
一个方法在执行过程中调用自身, 就称为 “递归”.
递归相当于数学上的 “数学归纳法”, 有一个起始条件, 然后有一个递推公式.
例如, 我们求 N!
起始条件: N = 1 的时候, N! 为 1. 这个起始条件相当于递归的结束条件.
递归公式: 求 N! , 直接不好求, 可以把问题转换成 N! == N * (N-1)!
递归的必要条件:
-
自己调用自己
-
递归出口
代码示例:递归求N的阶乘
public static int fac(int n) {if(n > 1) {return n * fac(n-1);}else {return 1;}
}public static void main(String[] args) {System.out.println(fac(5));
}
//------------------
//编译器运行结果为
//120
3.2 递归执行过程分析
执行过程图

程序按照序号中标识的 (1) -> (8) 的顺序执行.
3.3 递归练习
代码示例1 按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)
public static void print(int n) {if (n < 10) {System.out.println(n%10);return;}print(n / 10);System.out.println(n % 10);
}
代码示例2 递归求 1 + 2 + 3 + … + 10
public static int sum(int n) {if(n ==1) {return 1;}return n + sum(n - 1);
}
public static void main(String[] args) {Scanner scan = new Scanner(System.in);int num = scan.nextInt();System.out.println(sum(num));
}
代码示例3 写一个递归方法,输入一个非负整数,返回组成它的数字之和. 例如,输入 1729, 则应该返回1+7+2+9,它的和是19
public static int func(int n) {if(n < 10) {return n;}return (n%10) + func(n / 10);
}
代码示例4 求斐波那契数列的第 N 项
public static int fibonacci(int n) {if(n >2) {return fibonacci(n - 1) + fibonacci(n - 2);}return 1;
}
补充
循环和递归有什么区别呢?
递归的好处是:代码少,不好的地方:不好书写
循环的好处是:容易理解
递归浪费的空间比较多。经常会出现栈溢出的情况。
汉诺塔问题

如果有一个盘子:A->C 1(2^1-1)
两个盘子:A->B A->C B->C 3(2^2-1)
三个盘子:A->C A->B C->B A->C B->A B->C A->C 7(2^3-1)
核心思想:n个盘子,
n-1个盘子从pos1借助pos3移动到pos2.
第n个盘子从pos1->pos3
再将n-1个盘子借助pos1移动到pos3
核心思想:n个盘子先把n-1个放好,n-2个放好……
public static void hanoiTower(int n,char pos1,char pos2,char pos3) {if(n == 1) {move(pos1, pos3);return;}hanoiTower(n-1,pos1,pos3,pos2);move(pos1, pos3);hanoiTower(n-1,pos2,pos1,pos3);}
public static void move(char pos1,char pos2) {System.out.println(pos1 + "->" + pos2);
}
public static void main(String[] args) {hanoiTower(1,'A','B','C');System.out.println();hanoiTower(2,'A','B','C');System.out.println();hanoiTower(3,'A','B','C');
}
相关文章:
【JavaSE】方法的使用
方法的使用BIT-5-方法的使用绪论1. 方法概念及使用1.1什么是方法1.2 方法定义1.3 实参和形参的关系(重要)1.4 没有返回值的方法2. 方法重载2.1 为什么需要方法重载2.2 方法重载概念3. 递归3.1 生活中的故事3.2 递归的概念3.2 递归执行过程分析3.3 递归练…...
ModelScope 垂类检测系列模型介绍
文章目录ModelScope介绍垂类模型介绍调用方式1 Demo Service2 Notebook3 本地使用* 二次开发总结ModelScope介绍 ModelScope 是阿里达摩院推出的 中文版模型即服务(MaaS, Model as a Service)共享平台。该平台在2022年的云栖大会上发布,之前…...
Linux | Linux卸载和安装MySQL(Ubuntu版)
最近又来到了Linux学习了,原因是要接触云服务器相关知识, 所以博主整理了一些关于Linux的知识, 欢迎各位朋友点赞收藏,天天开心丫,快乐写代码! Linux系列文章请戳 Linux教程专栏 目录 一、卸载MySQL 1…...
【C1】数据类型,常量变量,输入输出,运算符,if/switch/循环,/数组,指针,/结构体,文件操作,/编译预处理,gdb,makefile,线程
文章目录1.数据类型:单双引号,char(1B),int/float(32位系统,大小一样4B,但存储方式不同),double(8B),long double…...
【深度学习】pytorch的基础操作
import torch import numpy as np # 1.1 根据已有的数据创建张量 def test01(): # 1.1 创建标量 data torch.tensor(10) print(data) # 1.2 使用numpy数组来创建张量 data np.random.randn(2,3) data torch.tensor(data) print(data) # 1.3使用list…...
MWORKS--同元软控MWORKS介绍、安装与使用
MWORKS--同元软控MWORKS介绍、安装与使用1 同元软控介绍1.1 同元软控简介1.2 同元软控发展历史2 MWORKS介绍2.1 MWORKS简介2.2 MWORKS产品描述3 装备数字化3.1 发展3.2 内涵3.3 系统模型发展成为产品的一部分3.4 MWORKS系统模型数据管理3.4 MWORKS为装备数字化提供的套件4 下载…...
Python 解决dilb和face_recognition第三方包安装失败
目录 dilb和face_recognition第三方包安装失败 亲测有效的解决方法:whl安装方式 dilb和face_recognition第三方包安装失败 场景复现:因为需要用到dlibface_recognition,基于OpenCV做一些人脸识别的项目,在Pycharm中进行pip清华…...
Mac系统Mysql的8.0.22版本安装笔记和密码重置修改密码等问题方法
忘记密码官网教程地址:https://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html 5.7数据库安装指南参考:https://jingyan.baidu.com/article/fa4125ac0e3c2928ac709204.html 初次安装8.0.22遇到许多坑,密码修改失败;…...
驱动 | Linux | NVMe 不完全总结
本文主要参考这里 1’ 2 的解析和 linux 源码 3。 此处推荐一个可以便捷查看 linux 源码的网站 bootlin 4。 更新:2022 / 02 / 11 驱动 | Linux | NVMe 不完全总结NVMe 的前世今生从系统角度看 NVMe 驱动NVMe CommandPCI 总线从架构角度看 NVMe 驱动NVMe 驱动的文件…...
一个测试人员,在现阶段的环境下如何在测试行业发展和自我价值。
前言周末和几个测试圈子里的大佬饭局上聊了一些职场和测试职业发展相关的话题,我将聊天的内容做了整理和阐述。。朋友圈有测试同学对这篇文章提了比较深刻的建议,下面是他的评价和建议:评价:据说是大佬饭桌总结,有两点…...
pwn手记录题2
fastbin_reverse_into_tcache(2.34) 本题所使用的libc版本为2.34;(最新版 libc2.34版本已经没有了所谓的hook函数,甚至exit_hook(实际为某个函数指针)也已经不能够使用;能够利用的手法已经很少了; 高版本glibc堆的几…...
CSS ~ 从入门到入坑。
CSS ~ 从入门到入坑。 文章目录CSS ~ 从入门到入坑。what。css 三种实现方式。选择器。id 选择器 > class 选择器 > 标签选择器。标签选择器。类选择器。id 选择器。层次选择器。后代选择器。子选择器。相邻兄弟选择器。通用选择器。结构伪类选择器。属性选择器。字体风格…...
成都哪家机构的Java培训比较好,求一个不坑的?
关于这个问题,相信你会得到很多条答案,以及很多家机构的自荐。既然如此,不如也了解一下老牌IT职业教育机构:有足够丰富的教学经验,丰富的教学产品资源以及成熟的就业保障体系,还有就是承担风险的能力。 很…...
《爆肝整理》保姆级系列教程python接口自动化(十二)--https请求(SSL)(详解)
简介 本来最新的requests库V2.13.0是支持https请求的,但是一般写脚本时候,我们会用抓包工具fiddler,这时候会 报:requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590) 小编…...
离线数据仓库
1 数据仓库建模 1.1 建模工具 PowerDesigner/SQLYog/EZDML… 1.2 ODS层 (1)保持数据原貌不做任何修改,起到备份数据的作用。 (2)数据采用压缩,减少磁盘存储空间(例如:压缩采用LZO&…...
【前端】Vue项目:旅游App-(23)detail:房东介绍、热门评论、预定须知组件
文章目录目标过程与代码房东介绍landlord热门评论HotComment预定须知Book效果总代码修改或添加的文件detail.vuedetail-book.vuedetail-hotComment.vuedetail-landlord.vue参考本项目博客总结:【前端】Vue项目:旅游App-博客总结 目标 根据detail页面获…...
JUC并发编程与源码分析
一、本课程前置知识及要求说明 二、线程基础知识复习 三、CompletableFuture 四、说说Java"锁"事 8锁案例原理解释: 五、LockSupport与线程中断 六、 Java内存模型之JMM 七、volatile与JMM 八、CAS 九、原子操作类之18罗汉增强 十、聊聊ThreadLocal 十一、Java对…...
Spark09: Spark之checkpoint
一、checkpoint概述 checkpoint,是Spark提供的一个比较高级的功能。有时候,我们的Spark任务,比较复杂,从初始化RDD开始,到最后整个任务完成,有比较多的步骤,比如超过10个transformation算子。而…...
《剑指offer》:数组部分
一、数组中重复的数字题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1…...
基于微信小程序图书馆座位预约管理系统
开发工具:IDEA、微信小程序服务器:Tomcat9.0, jdk1.8项目构建:maven数据库:mysql5.7前端技术:vue、uniapp服务端技术:springbootmybatis本系统分微信小程序和管理后台两部分,项目采用…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...
