目录
方法的定义
方法的格式
定义新方法的明确点
方法的重载
方法的形参与实参
方法的注意事项
方法调用四步骤
方法形参是基本和引用数据类型例子
基本数据类型
引用数据类型
方法的递归调用
方法的定义
简单的说:方法就是完成特定功能的代码块
方法的格式
权限修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2…) {
方法体;
return 返回值;
}
return的两个作用:
- 停止当前方法
- 将后面的返回值还给调用处,返回值跟返回值类型对应
定义新方法的明确点
写一个方法首先有两点需要明确
返回值类型 明确功能结果的数据类型,如果没有返回值,则写void
参数列表 明确有几个参数,以及参数的类型
有参数:小括号当中有内容,当一个方法需要一些数据条件,才能完成任务的时候,就是有参数。
例如两个数字相加,必须知道两个数字是各自多少,才能相加。
无参数:小括号当中留空。一个方法不需要任何数据条件,自己就能独立完成任务,就是无参数。
例如定义一个方法,打印固定10次HelloWorld。
方法的重载
比如说,但我们去定义两个数的和,三个数的和,四个数的和,这三个方法分别叫做sumTwo,sumThree,sumFor,对于这些功能类似的方法来说,因为参数列表不同,却需要记住那么多不同的方法名称,显得很麻烦,我们可以定义一个统一的名称getSum,所以出现了方法的重载。
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。这就是方法的重载
方法重载特点:
- 参数个数不同
- 参数类型不同
- 参数的多类型顺序不同
- 与返回值类型无关,只看方法名(相同)和参数列表(不同)
总体原则:在调用方法时,在编译阶段,虚拟机通过实参列表来调用最匹配的那个方法
好处:只需要记住唯一一个方法名称,就可以实现类似的多个功能
方法的形参与实参
形式参数:用于接收实际数据的变量
实际参数:实际参与运算的变量
方法的注意事项
1.方法定义之后不会执行,如果希望执行,一定要调用:单独调用、打印调用、赋值调用。
例如定义了一个两个int类型数字相加的方法:
public static int sum(int a, int b) {
int result = a + b;
return result;
}
单独调用:方法名称(参数); sum(10, 20);
打印调用:System.out.println(方法名称(参数)); System.out.println(sum(10, 20));
赋值调用:数据类型 变量名称 = 方法名称(参数); int number = sum(15, 25);
如果返回值类型是void的方法,这种方法只能够单独调用,不能进行打印调用或者赋值调用
2.如果方法有返回值,那么必须写上“return 返回值;”,不能没有。
3.return后面的返回值数据,必须和方法的返回值类型,对应起来。
4.对于一个void没有返回值的方法,不能写return后面的返回值,只能写return,相当于
结束方法。
5.对于void方法当中最后一行的return可以省略不写
6一个方法当中可以有多个return语句,但是必须保证同时只有一个会被执行到,两个return不能连写。例如if和else里面都有一个return,但是只会有一个return会被执行到
方法调用四步骤
第一步:找到方法
第二步:参数传递
第三步:执行方法体
第四步:带着返回值回到方法的调用处
有返回值和无返回值的对比:
方法形参是基本和引用数据类型例子
基本数据类型
遇到此类型可以画图解释,由上图可知,代码片段都先被加载进方法区,首先调用main方法,main方法进栈,此时输出a=10,b=20,之后调用change方法,change方法进栈,a和b分别被当做实际参数传进change方法的形参中,在change方法中,a=20,b=40,change方法结束后直接从内存消失,弹栈,此时访问a,b变量会直接从main方法中取,所以是10,20
结论:如果方法的参数是基本数据类型,形式参数的改变不影响实际参数
引用数据类型
结论:如果参数是引用数据类型,形式参数的改变直接影响实际参数,因为传递是实参的地址
方法的递归调用
方法递归调用就是在方法体中又调用了它自身.
方法递归调用主要确定两点:
1.找到规律
2.确定结束条件
例如求n的阶乘
/*
定义方法,返回n的阶乘, 通过参数来接收一个整数n,返回它的阶乘
6! = 1*2*3*4*5*6
5! = 1*2*3*4*5
4! = 1*2*3*4
3! = 1*2*3
2! = 1*2
1! = 1
规律:
n! = (n-1)! * n
结束条件:
1! = 1
*/
public static long factor( int n ){ if ( n == 1 ){ return 1; } return factor(n-1) * n; //返回n-1的阶乘 * n, 调用它自身返回n-1的阶乘 }