具有某种特定功能的代码段。
某段代码经常使用,所以使用大括号,将这段代码包起来,起个名字。以后就使用这个名字来代替这段代码。
好处:
1、提高了代码的复用性。
2、提高了代码的封装性,大括号中的内容,其他调用者看不到也无法直接访问。
3、简化了软件设计的思维难度。
格式:
修饰符 返回值类型 方法名称 (参数列表) {
方法体语句;
return语句;
}
修饰符:现在全都写成public static。
返回值类型:方法具有功能,有可能会有一些产出,就需要将数据返回给调用者。调用者需要知道生产出来的数据的数据类型。
方法名称:给这段代码起的名字。只要是一个合法的标识符即可。第一个单词的首字母小写,从第二个单词开始首字母大写。动词、动宾结构。
参数列表:这段代码要完成功能,可能会需要一些资源。在参数列表中,需要定义一些变量,内存中表示为容器,在调用本方法的时候,会由外界传入数据,存储到这些变量容器中。使用变量符号,表示那些将来可能传入的数据。
方法体语句:真正要完成该方法功能的执行逻辑。
return语句:最终生产出来的结果,要返回给调用者,使用return语句返回。如果没有任何生产内容,就可以写一个return;用于表示方法结束。
格式: 方法名称(实际参数);
方法调用的三种形式:
1、直接调用:表示某些内容的执行,而没有生产结果的情况
2、输出调用:方法的返回值,需要打印。如果这个结果只打印一次,不做其他的操作。
3、赋值调用:方法的返回值,使用某个变量来接收。如果这个结果需要反复使用。
方法调用总体特点: 方法不调用,就不执行。
方法定义:
1、方法不能嵌套定义,方法都是定义在主方法的下面。
2、方法的先后没有区别
3、方法的定义是平级关系
4、方法可以嵌套调用,甚至可以自己调用自己
参数列表:
1、形式参数:在定义方法时使用,需要加上数据类型的参数,也就是对于变量进行声明。各个变量之间,使用逗号分隔。
2、实际参数:在方法调用时使用,不能加上数据类型的参数,也就是对于变量进行赋值。各个实际参数之间,也使用逗号分隔。顺序必须和定义的方法的形式参数的顺序一致。
return语句:
1、语句表达方法结束了;表示方法的产出内容。
2、如果方法没有具体的返回内容,可以写成return; 此时的return语句可以省略。返回值类型必须写成void。
3、如果方法有具体的返回内容,那么return后面就需要加上返回的那个数据。返回值类型必须和return语句后面的数据的数据类型一致。
4、return语句返回数据,返回给调用者。谁来调用当前方法,当前方法就将数据返回给谁。
无参无返回
有参无返回
无参有返回
有参有返回
方法重载overload:指在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可,与修饰符和返回值类型无关。
重载方法参数列表不同:
参数个数不同,如method(int x)与method(int x,int y)不同。
参数类型不同,如method(int x)与method(double x)不同。
参数顺序不同,如method(int x,double y)与method(double x,int y)不同。
注意:
1.重载只与方法名有关和参数类型相关与返回值无关。
如void method(int x)与int method(int y)不是方法重载,不能同时存在。
2.重载与具体的变量标识符无关。
如method(int x)与method(int y)不是方法重载,不能同时存在。
总结:方法重载只与方法名和参数列表有关,和返回值/修饰符均无关(方法重载指的是在同一个类中)
递归就是一个方法直接或间接的调用自身。
递归是解决复杂问题的重要思想
递归的思想就是数学上递推的思想。
把大任务降解为与之类似的规模更小的任务。
递归的思想:如果有人替我打印出0-8,我自己打印一个9,不就完成了吗?
示例代码
public class Test { public static void main(String[] args) { print0to9(9); } //自己打印9,0-8交给别人 public static void print0to9(int n) { if(n>0) { print0to9(n-1); } System.out.println(n);//0 1 2 3 4 5 6 7 8 9 } }注:
在使用递归算法时,必须找到递归的出口(也就是不再递归的条件)。
递归方法中必须有选择语句。
递归的层次太深了,造成调用桟的溢出。
栈是一种先进后出的数据结构。在调用方法时,就是一个进栈和出栈的过程。
方法调用好比我们做一件事的郭晨中,暂时中断,去做更紧急的事,然后还要回到原处继续。
栈顶的元素,就是我们当前正在处理的元素。
被压在下面的元素,是一会还要继续处理的元素。
(1)输出 int a 到 int b
public class Test { public static void main(String[] args) { printAtoB(1,5); } public static void printAtoB(int a,int b){ if(a<b) { printAtoB(a,b-1); } System.out.println(b); } }(2)递归求阶乘
public class Test { public static void main(String[] args) { int result = jiecheng(3); System.out.println(result);//6 } public static int jiecheng(int n) { if(n==1) { return 1; } return n*jiecheng(n-1); } }(3)斐波那契数列 1,1,2,3,5,8,13,21,34........ 求第n个值。
public class Test { public static void main(String[] args) { int result = fb(5);//5 System.out.println(result); } public static int fb(int n) { if(n==1 || n==2) { return 1; } return fb(n-2)+fb(n-1); } }注:
递归必须要有出口
递归内存消耗大,容易发生内存溢出
层次调用越多,越危险。
例如:递归求阶乘,100的结果为0。
