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

【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. 掌握方法的定义以及使用

  2. 掌握方法传参

  3. 掌握方法重载

  4. 掌握递归

绪论

在编程中也是一样,某段功能的代码可能频繁使用到,如果在每个位置都重新实现一遍,会:

  1. 使程序变得繁琐

  2. 开发效率低下,做了大量重复性的工作

  3. 不利于维护,需要改动时,所有用到该段代码的位置都需要修改

  4. 不利于复用

因此,在编程中,我们也可以将频繁使用的代码封装成"函数"(方法),需要时直接拿来链接(即方法名–方法的入口地址)使用即可,避免了一遍一遍的累赘。

1. 方法概念及使用

1.1什么是方法

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

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

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

  3. 让代码更好理解更简单.

  4. 直接调用现有方法开发, 不必重复造轮子.

比如:在日历程序中经常要判断一个年份是否为闰年,则有如下重复性代码:

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);
}

注意事项

  1. 修饰符:现阶段直接使用public static 固定搭配

  2. 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成void

  3. 方法名字:采用小驼峰命名

  4. 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开

  5. 方法体:方法内部要执行的语句

  6. 在java当中,方法必须写在类当中

  7. 在java当中,方法不能嵌套定义

  8. 在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 方法重载概念

image-20221110184548405

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

在Java中方法也是可以重载的。

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

image-20221110183822807

注意:

  1. 方法名必须相同

  2. 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)

  3. 与返回值类型是否相同无关

  4. 和参数的类型名无关

image-20221110184218978

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

补充:

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... arrint[] arr类似

我们把int... arr这样的参数称为可变参数,但是这样代码的可读性降低,我们一般不这样写。

6.作业+递归+数组

3. 递归

3.1 生活中的故事

从前有坐山,山上有座庙,庙里有个老和尚给小和尚将故事,讲的就是:

"从前有座山,山上有座庙,庙里有个老和尚给小和尚讲故事,讲的就是:

“从前有座山,山上有座庙…”

“从前有座山……”

上面的故事有个特征:自身中又包含了自己,该种思想在数学和编程中非常有用,因为有些时候,我们遇到的问题直接并不好解决,但是发现将原问题拆分成其子问题之后,子问题与原问题有相同的解法,等子问题解决之后,原问题就迎刃而解了

3.2 递归的概念

一个方法在执行过程中调用自身, 就称为 “递归”.

递归相当于数学上的 “数学归纳法”, 有一个起始条件, 然后有一个递推公式.

例如, 我们求 N!

起始条件: N = 1 的时候, N! 为 1. 这个起始条件相当于递归的结束条件.

递归公式: 求 N! , 直接不好求, 可以把问题转换成 N! == N * (N-1)!

递归的必要条件:

  1. 自己调用自己

  2. 递归出口

代码示例:递归求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 递归执行过程分析

执行过程图

image-20221111122304619

程序按照序号中标识的 (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;
}

补充

循环和递归有什么区别呢?

递归的好处是:代码少,不好的地方:不好书写

循环的好处是:容易理解

递归浪费的空间比较多。经常会出现栈溢出的情况。

汉诺塔问题

image-20221112141350454

如果有一个盘子: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 实参和形参的关系&#xff08;重要&#xff09;1.4 没有返回值的方法2. 方法重载2.1 为什么需要方法重载2.2 方法重载概念3. 递归3.1 生活中的故事3.2 递归的概念3.2 递归执行过程分析3.3 递归练…...

ModelScope 垂类检测系列模型介绍

文章目录ModelScope介绍垂类模型介绍调用方式1 Demo Service2 Notebook3 本地使用* 二次开发总结ModelScope介绍 ModelScope 是阿里达摩院推出的 中文版模型即服务&#xff08;MaaS, Model as a Service&#xff09;共享平台。该平台在2022年的云栖大会上发布&#xff0c;之前…...

Linux | Linux卸载和安装MySQL(Ubuntu版)

最近又来到了Linux学习了&#xff0c;原因是要接触云服务器相关知识&#xff0c; 所以博主整理了一些关于Linux的知识&#xff0c; 欢迎各位朋友点赞收藏&#xff0c;天天开心丫&#xff0c;快乐写代码&#xff01; Linux系列文章请戳 Linux教程专栏 目录 一、卸载MySQL 1…...

【C1】数据类型,常量变量,输入输出,运算符,if/switch/循环,/数组,指针,/结构体,文件操作,/编译预处理,gdb,makefile,线程

文章目录1.数据类型&#xff1a;单双引号&#xff0c;char&#xff08;1B&#xff09;&#xff0c;int/float&#xff08;32位系统&#xff0c;大小一样4B&#xff0c;但存储方式不同&#xff09;&#xff0c;double&#xff08;8B&#xff09;&#xff0c;long double&#xf…...

【深度学习】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第三方包安装失败 亲测有效的解决方法&#xff1a;whl安装方式 dilb和face_recognition第三方包安装失败 场景复现&#xff1a;因为需要用到dlibface_recognition&#xff0c;基于OpenCV做一些人脸识别的项目&#xff0c;在Pycharm中进行pip清华…...

Mac系统Mysql的8.0.22版本安装笔记和密码重置修改密码等问题方法

忘记密码官网教程地址&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html 5.7数据库安装指南参考&#xff1a;https://jingyan.baidu.com/article/fa4125ac0e3c2928ac709204.html 初次安装8.0.22遇到许多坑&#xff0c;密码修改失败&#xff1b…...

驱动 | Linux | NVMe 不完全总结

本文主要参考这里 1’ 2 的解析和 linux 源码 3。 此处推荐一个可以便捷查看 linux 源码的网站 bootlin 4。 更新&#xff1a;2022 / 02 / 11 驱动 | Linux | NVMe 不完全总结NVMe 的前世今生从系统角度看 NVMe 驱动NVMe CommandPCI 总线从架构角度看 NVMe 驱动NVMe 驱动的文件…...

一个测试人员,在现阶段的环境下如何在测试行业发展和自我价值。

前言周末和几个测试圈子里的大佬饭局上聊了一些职场和测试职业发展相关的话题&#xff0c;我将聊天的内容做了整理和阐述。。朋友圈有测试同学对这篇文章提了比较深刻的建议&#xff0c;下面是他的评价和建议&#xff1a;评价&#xff1a;据说是大佬饭桌总结&#xff0c;有两点…...

pwn手记录题2

fastbin_reverse_into_tcache(2.34) 本题所使用的libc版本为2.34&#xff1b;&#xff08;最新版 libc2.34版本已经没有了所谓的hook函数&#xff0c;甚至exit_hook(实际为某个函数指针)也已经不能够使用&#xff1b;能够利用的手法已经很少了&#xff1b; 高版本glibc堆的几…...

CSS ~ 从入门到入坑。

CSS ~ 从入门到入坑。 文章目录CSS ~ 从入门到入坑。what。css 三种实现方式。选择器。id 选择器 > class 选择器 > 标签选择器。标签选择器。类选择器。id 选择器。层次选择器。后代选择器。子选择器。相邻兄弟选择器。通用选择器。结构伪类选择器。属性选择器。字体风格…...

成都哪家机构的Java培训比较好,求一个不坑的?

关于这个问题&#xff0c;相信你会得到很多条答案&#xff0c;以及很多家机构的自荐。既然如此&#xff0c;不如也了解一下老牌IT职业教育机构&#xff1a;有足够丰富的教学经验&#xff0c;丰富的教学产品资源以及成熟的就业保障体系&#xff0c;还有就是承担风险的能力。 很…...

《爆肝整理》保姆级系列教程python接口自动化(十二)--https请求(SSL)(详解)

简介 本来最新的requests库V2.13.0是支持https请求的&#xff0c;但是一般写脚本时候&#xff0c;我们会用抓包工具fiddler&#xff0c;这时候会 报&#xff1a;requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590) 小编…...

离线数据仓库

1 数据仓库建模 1.1 建模工具 PowerDesigner/SQLYog/EZDML… 1.2 ODS层 &#xff08;1&#xff09;保持数据原貌不做任何修改&#xff0c;起到备份数据的作用。 &#xff08;2&#xff09;数据采用压缩&#xff0c;减少磁盘存储空间&#xff08;例如&#xff1a;压缩采用LZO&…...

【前端】Vue项目:旅游App-(23)detail:房东介绍、热门评论、预定须知组件

文章目录目标过程与代码房东介绍landlord热门评论HotComment预定须知Book效果总代码修改或添加的文件detail.vuedetail-book.vuedetail-hotComment.vuedetail-landlord.vue参考本项目博客总结&#xff1a;【前端】Vue项目&#xff1a;旅游App-博客总结 目标 根据detail页面获…...

JUC并发编程与源码分析

一、本课程前置知识及要求说明 二、线程基础知识复习 三、CompletableFuture 四、说说Java"锁"事 8锁案例原理解释: 五、LockSupport与线程中断 六、 Java内存模型之JMM 七、volatile与JMM 八、CAS 九、原子操作类之18罗汉增强 十、聊聊ThreadLocal 十一、Java对…...

Spark09: Spark之checkpoint

一、checkpoint概述 checkpoint&#xff0c;是Spark提供的一个比较高级的功能。有时候&#xff0c;我们的Spark任务&#xff0c;比较复杂&#xff0c;从初始化RDD开始&#xff0c;到最后整个任务完成&#xff0c;有比较多的步骤&#xff0c;比如超过10个transformation算子。而…...

《剑指offer》:数组部分

一、数组中重复的数字题目描述&#xff1a;在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的&#xff0c;但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如&#xff0c;如果输入长度为7的数组{2,3,1…...

基于微信小程序图书馆座位预约管理系统

开发工具&#xff1a;IDEA、微信小程序服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8项目构建&#xff1a;maven数据库&#xff1a;mysql5.7前端技术&#xff1a;vue、uniapp服务端技术&#xff1a;springbootmybatis本系统分微信小程序和管理后台两部分&#xff0c;项目采用…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...

【若依】框架项目部署笔记

参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作&#xff1a; 压缩包下载&#xff1a;http://download.redis.io/releases 1. 上传压缩包&#xff0c;并进入压缩包所在目录&#xff0c;解压到目标…...