一、什么是方法
前面说过,我们有时候需要做重复的事情,于是把这些代码写进了循环语句中称作循环体。现在,我们给这段循环语句起了名字,以后再需要使用这个循环体的时候,只需要调用循环语句的名字即可。
在上面的叙述中,被提取出来,起了名字的代码块就可以看做是程序中定义的方法。
我们还是用妈妈打小明的案例看一下。
//下面是不使用方法时,三个妈妈打小明不同的例子。
public class Example{
public static void main (String [] args){
//第一个
for(休息次数=0;休息次数<2;休息次数++){
for(妈妈打小明次数=0;妈妈打小明次数<50;妈妈打小明次数++){
噼里啪啦;
}
}
//第二个
for(休息次数=0;休息次数<3;休息次数++){
for(妈妈打小明次数=0;妈妈打小明次数<30;妈妈打小明次数++){
噼里啪啦;
}
}
//第三个
for(休息次数=0;休息次数<4;休息次数++){
for(妈妈打小明次数=0;妈妈打小明次数<40;妈妈打小明次数++){
噼里啪啦;
}
}
}
}
//代码写的不适很严谨,也不会执行,但是是为了好理解
我们不使用方法需要写这么多代码,才能实现妈妈打三轮小明,那么如果有了方法,上面的代码会变成什么样子呢
public class Example01{
public static void main(String [] args){
daxiaoming(2,50);//调用方法
daxiaoming(3,30);
daxiaoming(4,40);
}
public static void daxiaoming (int 休息次数,int 妈妈打小明次数){
for(休息次数=0;休息次数<4;休息次数++){
for(妈妈打小明次数=0;妈妈打小明次数<40;妈妈打小明次数++){
噼里啪啦;
}
}
}
}
我们会发现代码少了很多,{ }内实现打小明的代码是方法体;daxiaoming是方法名;休息次数,妈妈打小明次数是方法的参数;方法名前的void是方法的返回值类型
方法的具体格式如下
修饰符 返回值类型 方法名(【参数类型 参数名1,参数类型,参数名2,……】){
执行语句
……
……
return返回值;
}
这其中【 】内的参数可以加也可以不加,这要看你的方法是不是需要接受参数,不需要则不加,若不加即参数列表为空,()内不需要写任何代码。
方法的返回值类型和return是一起使用的。如果没有返回值类型,即返回值是void,则不需要return语句。若有返回值类型,则返回的返回值必须为方法中声明的返回值类型。
二、方法的重载
生活中有时候需要对不同的情况作出不同的反应,例如妈妈打小明休息次数不同,打的次数也不同。例如以前是休息三次,打三十次,现在是休息三次,打三十次,用拖鞋打。这时候如果变成代码就会发现为这两种打小明的方法定义两个不同的名字还可以接受,万一妈妈创造了很多种,岂不是很麻烦?
于是我们有了方法的重载。即,java允许在一个程序中定义多个名城相同的方法,但是参数类型和个数必须不同,这就是方法的重载。
通过简单的加法来看一下
public class Example02{
public static void main (String [] args){
//定义两个变量用来进行储存结果
int sum1=add(1,2);
int sum2=add(1,2,3);
//输出结果
System.out.println("sum1="+sum1);
System.out.println("sum2="+sum2);
}
public static int add(int x,int y){
return x+y;
}
public static int add(int x,int y,int z){
return x+y+z;
}
}
//结果是sum1=3;sum2=6
上面的例子可以看出,虽然调用的方法名字是一样的,但是实际参与计算的代码却不同。这是因为java会自动对我们输入的数进行匹配,从而为我们选择正确的代码段执行。
需要注意的是 方法的重载和返回值类型是无关的,他只需要满足两个条件:①方法名相同②参数个数或者参数类型不同
三、方法的递归
方法的递归就是方法自己调用自己的过程。
递归必须要有结束条件,否则就会陷入无限递归的状态。
public class Example03{
public static void main (String [] args){
int sum=getSum(4);//调用递归方法,获得1~4的和
System.out.println(getSum);//打印结果
}
public static int getSum(int n){
if(n==1){
//满足条件,递归结束
return 1;
}
int temp=getSum(n-1);
return temp+n;
}
}
下面来看一下代码执行的步骤
①首先传入的是4,不等于1,执行temp=getSum(4-1)即temp=getSum(3)
②然后返回temp+4 即getSum(3)+4
③因为②中含有不明的getSum(3),所以要对getSum(3)再进行①中的运算,发现得到结果是getSum(2)+3,然后再对getSum(2)进行①中的运算,发现得到的结果是getSum(1)+2,然后再对getSum(1)进行代码中的运算,发现getSum(1)=1。
④然后把每一步中的数字相加,即1+2+3+4=10