[JavaSE] 方法及方法的重载与递归—Day11
目录
一.方法
1.无参数无返回值的方法
2.带参数的方法
3.带返回值的方法
二、方法的重载
三、方法的递归
总结:
一.方法
含义:特点功能的代码块
好处:
解决代码的冗余
增加了代码的可读性
增加了代码的可维护性
分类:
无参数无返回值的方法
带参数的方法
带返回值的方法
1.无参数无返回值的方法
语法结构:
public static void 方法名(){ ...代码块... }
需求:声明一个方法,打印5行三角形
package work;public class test {public static void main(String args[]) {method();}public static void method(){for(int i = 0;i<5;i++){for(int j = 0;j<=i;j++){System.out.print("*");}System.out.println();}}}
运行结果:
2.带参数的方法
语法结构:
public static void 方法名(参数列表){ ...代码块...}
概念:
形式参数/形参:方法声明时规定的参数
形参必须指定数据类型
形参的作用域在整个方法内
实际参数/实参:调用方法时传入的具体数据
实参的类型必须和形参的类型兼容
多个形参或实参用逗号分隔
需求:声明一个方法,打印三角形,行数和内容由调用方指定
public class Test02{public static void main(String[] args){//调用method(3 ,"$");method(5 ,"%");method('!',"#");//ASCII - 33}public static void method(int num, String str){for(int i = 0;i<num;i++){for(int j = 0;j<=i;j++){System.out.print(str);}System.out.println();}}}
运行结果:
!的ASCII 为33,故打印33行的三角形
3.带返回值的方法
语法结构:
public static 数据类型 方法名([参数列表]){ ...代码块... return 数据;}
概念:
方法声明时可以规定返回值的类型
void表示无返回值,代表调用方法,该方法不会给你返回任何数据
return后面接的数据是要返回的值
方法声明时的返回值类型和return后面的具体数据的类型必须兼容
方法功能的单一性
返回值的数据只能有一个
需求:声明一个方法,传入三个int类型的数字,返回最大值
代码部分:
String str = method01();System.out.println(str);int num = method02();System.out.println(num);//在控制台输入3个数字,比较大小,输出最大值Scanner scan = new Scanner(System.in);System.out.println("请输入第一个数字:");int a = scan.nextInt();System.out.println("请输入第二个数字:");int b = scan.nextInt();System.out.println("请输入第三个数字:");int c = scan.nextInt();int max = getMax(a,b);max = getMax(max,c);System.out.println(max);}public static int getMax(int a,int b){int max = (a>b)?a:b;return max;}public static int method02(){return 'a';}public static String method01(){return "努力学习";}
运行结果:
二、方法的重载
方法重载就是方法名称重复,加载参数不同。
在一个Java类中,定义多个同名的方法,如果方法名相同,方法参数不同,包括参数的类型和个数都不同,叫做方法的重载。调用重载方法时,Java 编译器通过检查调用的方法的参数类型和个数选择一个恰当的方法。方法重载常用于创建完成一组任务相似但参数的类型或参数的个数或参数的顺序不同的方法。
方法的重载,既可以发生在普通方法上,也可以发生在构造方法上。方法的重载,既可以发生在同类中,也可以发生在父子类中。
Java方法的重载:返回类型、修饰符可以相同,也可不同。要求同名的方法必须有不同的参数表,仅有返回类型不同是不足以区分两个重载的方法。
含义:方法与方法之间的关系,必须要满足几个条件
条件:
1.在同一个类里
2.方法名必须一致
3.参数列表的个数或者类型不一致
4.与返回值无关
好处:系统会根据实参的个数和类型自动匹配到对应的方法中
应用场景:在一个类中编写多个方法,多个方法的功能大致一样(说明这几个方法名应该是一样的),细节实现不一样,就考虑使用重载
例子:
需求:编写一个方法,传入两个int值,比较大小,返回最大值
需求:编写一个方法,传入三个int值,比较大小,返回最大值
需求:编写一个方法,传入两个double值,比较大小,返回最大值
需求:编写一个方法,传入三个double值,比较大小,返回最大值
代码实现:
import java.util.Scanner;public class Test04{public static void main(String[] args){//注意:方法有返回值才能打印System.out.println(getMax(10.1,20.2,30.3));}public static int getMax(int a,int b){int max = (a>b)?a:b;return max;}public static int getMax(int a,int b,int c){int max = (a>b)?a:b;max = (max>c)?max:c;return max;}public static double getMax(double a,double b){double max = (a>b)?a:b;return max;}public static double getMax(double a,double b,double c){double max = (a>b)?a:b;max = (max>c)?max:c;return max;}//两个method方法算重载的关系//第一个参数与第一个参数比较,第二个参数与第二个参数比较public static void method(int i ,String str){}public static void method(String str,int i ){}}
三、方法的递归
方法的递归是指在一个方法的内部调用自身的过程。递归必须要有结束条件,否则将陷入无限递归的状态,永远无法结束调用。
可参考:【递归详解】递归的效率问题及递归与循环比较_Vengo€bs的博客-CSDN博客
递归的反面案例,如下例子就会报错- StackOverflowError(栈内存溢出)
public class Test05{public static void main(String[] args){method();}public static void method(){method();}}
所以在使用方法的递归时,一定要注意找规律、找出口
例1:设计一个方法,求n的阶乘
分析:
阶乘是数学里的概念
5! = 1*2*3*4*5 5! = 4! * 5
4! = 1*2*3*4 4! = 3! * 4
3! = 1*2*3 3! = 2! * 3
2! = 1*2 2! = 1! * 2
1! = 1 1! = 1
找规律:n! = (n-1)!*n
找出口:1! = 1
代码实现:
public class Test06{public static void main(String[] args){int num = method(5);System.out.println(num);//120}public static int method(int n){if(n == 1){return 1;}else{return method(n-1)*n;}}}
例2:不死神兔 - 斐波那契数列
有一对兔子,从出生后第三个月起每个月都生一对兔子,
小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,
问第n个月的兔子对数为多少?
分析:
找规律:除了第一个月和第二个月,当月兔子的对数都是上个月+上上个月
找出口:第一个月和第二个月都是1对兔子
代码实现:
public class Test07{public static void main(String[] args){int num = getRabbit(8);System.out.println("第8个月兔子的对数:" + num);//21}public static int getRabbit(int n){if(n == 1 || n == 2){return 1;}else{return getRabbit(n-1) + getRabbit(n-2);}}}
总结:
编写一个方法考虑顺序:
1.方法名(做到见名知意)
2.形参列表
3.返回值
一个方法不需要传入数据也不需要返回数据,就使用无参数无返回值的方法
需要外界将数据传入到方法内部,就使用带参数的方法
需要将方法内的数据返回给调用放,就使用带返回值的方法
方法的递归就是方法调用方法本身,要注意找规律、找缺口