【JavaSE】方法的使用

news2024/9/24 20:33:47

方法的使用

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

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

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

相关文章

C++之异常处理

异常异常是面向对象语言处理错误的一种方式。当一个函数出现自己无法处理的错误时&#xff0c;可以抛出异常&#xff0c;然后输的直接或者间接调用者处理这个错误。语法捕获全部的异常try {//可能抛出异常的代码//throw异常对象 } catch(...) {//不管什么异常&#xff0c;都在这…

Java之动态规划之子序列问题

目录 0.动态规划问题 一.最长递增子序列 1.题目描述 2.问题分析 3.代码实现 二.最长递增子序列 1.题目描述 2.问题分析 3.代码实现 三.最长重复子数组 1.题目描述 2.问题分析 3.代码实现 4.代码的优化(滚动数组) 四.最长公共子序列 1.题目描述 2.问题分析 3.代…

C语言学习笔记(五):数组的使用

数组的定义 数组是一组有序数据的集合。数组中各数据的排列是有一定规律的&#xff0c;下标代表数据在数组中的序号。 用数组名和下标即可唯一地确定数组中的元素。 数组中的每一个元素都属于同一个数据类型。 一维数组 定义与引用 int a[10] {0,1,2,3,4,5,6,7,8&#xf…

Matlab绘制隐函数总结-二维和三维

1.二维隐函数 二维隐函数满足f(x,y)0f(x,y)0f(x,y)0&#xff0c;这里无法得到yf(x)yf(x)yf(x)的形式。不能通过普通函数绘制。 我们要关注的是使用fplot函数和fimplicit函数。 第1种情况&#xff1a;基本隐函数 基本的隐函数形式形如&#xff1a; x2y22x2(x2y2)12x^{2}y^{…

【Qt】Qt 隐式共享

文章目录一、导读二、隐式共享简介三、源码角度分析隐式共享四、隐式共享在开发中的使用五、隐式共享迭代器问题六、隐式共享类和线程一、导读 在实际开发中&#xff0c;Qt中很多类可以直接作为函数参数传递&#xff0c;这样做是为了什么&#xff1f;其背后的实现机制又是什么…

进程,线程

进程是操作系统分配资源的基本单位&#xff0c;线程是CPU调度的基本单位。 PCB&#xff1a;进程控制块&#xff0c;操作系统描述程序的运行状态&#xff0c;通过结构体task,struct{…}&#xff0c;统称为PCB&#xff08;process control block&#xff09;。是进程管理和控制的…

#电子电气架构——Vector工具常见问题解决三板斧

我是穿拖鞋的汉子,魔都中一位坚持长期主义的工科男。 今天在与母亲聊天时,得到老家隔壁邻居一位大姐年初去世的消息,挺让自己感到伤感!岁月如流水,想抓都抓不住。想起平时自己加班的那个程度,可能后续也要自己注意身体啦。 老规矩,分享一段喜欢的文字,避免自己成为高知…

千锋教育嵌入式物联网教程之系统编程篇学习-03

目录 进程的终止 exit函数 _exit函数 进程退出清理 进程间的替换 进程间通信 常见通信机制 进程间通信的实质 信号 产生信号的方式 信号的默认处理方式 进程对信号的处理方式 kill函数 进程的终止 使用exit函数对进程进行终止&#xff0c;而return只是结束函数&a…

电子技术——共模抑制

电子技术——共模抑制 我们在之前学习过&#xff0c;无论是MOS还是BJT的差分输入对&#xff0c;共模信号并不会改变漏极电流的大小&#xff0c;因此我们说差分输入对共模信号无响应。但是实际上由于各种客观非理想因素&#xff0c;例如电流源有限阻抗等&#xff0c;此时共模是影…

LINUX提权入门手册

前言 发点存货 LINUX权限简介 在学习提权之前我们先了解一下linux里面的权限我们使用命令: ls -al即可查看列出文件所属的权限&#xff1a; 文件头前面都有一段类似的字符&#xff0c;下面我们仔细分析一下里面符号分别代表什么。 -rw-r--r-- 1 root root 第一个符号-的…

现代 cmake (cmake 3.x) 操作大全

cmake 是一个跨平台编译工具&#xff0c;它面向各种平台提供适配的编译系统配置文件&#xff0c;进而调用这些编译系统完成编译工作。cmake 进入3.x 版本&#xff0c;指令大量更新&#xff0c;一些老的指令开始被新的指令集替代&#xff0c;并加入了一些更加高效的指令/参数。本…

MongoDB--》MongoDB数据库以及可视化工具的安装与使用—保姆级教程

目录 数据库简介 MongoDB数据库的安装 MongoDB数据库的启动 MongoDB数据库环境变量的配置 MongoDB图形化管理工具 数据库简介 在使用MongoDB数据库之前&#xff0c;我们应该要知道我们使用它的原因&#xff1a; 在数据库当中&#xff0c;有常见的三高需求&#xff1a; Hi…

如何手写一个springboot starter?

本文主要分享了如何手写一个spring starter&#xff0c;把你的代码作为jar包进行开源。命名规则&#xff08;不要使用spring-boot开头&#xff0c;以避免将来spring-boot官方使用你的starter而重名&#xff09;官方命名格式为&#xff1a;spring-boot-starter-xxx非官方命名格式…

ucos-ii 的任务调度原理和实现

ucosii 任务调度和原理1、ucos-ii 任务创建与任务调度 1.1、任务的创建 当你调用 OSTaskCreate( ) 进行任务的创建的时候&#xff0c;会初始化任务的堆栈、保存cpu的寄存器、创建任务的控制块&#xff08;OS_TCB&#xff09;等的操作&#xff1b; if (OSTCBPrioTbl[prio] (OS_…

Python中如何书写文件路径

当程序运行时&#xff0c;变量是保存数据的好方法&#xff0c;但变量、序列以及对象中存储的数据是暂时的&#xff0c;程序结束后就会丢失&#xff0c;如果希望程序结束后数据仍然保持&#xff0c;就需要将数据保存到文件中。Python 提供了内置的文件对象&#xff0c;以及对文件…

数据库 delete 表数据后,磁盘空间为什么还是被一直占用?

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 最近有个上位机获取下位机上报数据的项目&#xff0c…

计算机网络6:Http协议

目录HTTP1.基本概念1.1.1 URI2. 请求和响应报文2.1.请求报文2.2.响应报文3.HTTP报文实现细节3.1响应头主要字段3.2HTTP状态码3.3 HTTP方法3.3.1 GET方法3.3.2 HEAD3.3.3 POST3.3.4 PUT3.3.5 PATCH3.3.6 DELETE3.3.7 OPTIONS3.3.8 CONNECT3.4 HTTP首部&#xff08;头部&#xff…

【MT7628】开发环境搭建-Fedora12安装之后无法上网问题解决

1.按照如下图所示,打开Network Connections 2.点击Network Connections,弹出如下界面

面向对象程序(C++)设计基础

一、类&对象C 在 C 语言的基础上增加了面向对象编程&#xff0c;C 支持面向对象程序设计。类是 C 的核心特性&#xff0c;通常被称为用户定义的类型。类提供了对象的蓝图&#xff0c;所以基本上&#xff0c;对象是根据类来创建的。声明类的对象&#xff0c;就像声明基本类型…

面试题(二十二)消息队列与搜索引擎

2. 消息队列 2.1 MQ有什么用&#xff1f; 参考答案 消息队列有很多使用场景&#xff0c;比较常见的有3个&#xff1a;解耦、异步、削峰。 解耦&#xff1a;传统的软件开发模式&#xff0c;各个模块之间相互调用&#xff0c;数据共享&#xff0c;每个模块都要时刻关注其他模…