每个方法都表示一种行为或者能力。方法类似于c语言的函数,为了提高代码的可利用性,将每个功能模块抽象成为一种方法。
例如:
//计算1!+ 2! + 3! + 4! + 5! int sum = 0; for(int i = 1;i < 5; i++){ int temp = 0; for(int j = 0;j < i;j++){ temp *= j; } sum += temp; } System.out.println(sum);
像如上这个例子,可以将求阶乘和加法封装为一种方法,在使用的过程中只需要调用该方法就可以解决。
在JAVA里如何定义一个方法呢?请看下面这个例子:
public static int add(int a, int b){ return a + b; }
不难看出,首先需要确定该方法的访问权限 public ,意味着可以被任何类来使用,其次static说明了该方法为全局的,然后加上方法的返回类型和形式参数。一堆中括号包含了方法的内容。
方法一旦定义,就必须写他的实现。方法的定义位置可以任意放置,这一点是和C语言有所不同。
方法的调用跟c语言函数调用类似,也就是方法名加参数的方法来调用。
int a = 10; int b = 20; int sum = add(a,b); System.out.println(sum);
需要注意的是,对方法进行传参的时候发生形参实例化,只是形参实例化对实参的一份拷贝,并不直接拿取实际参数的值。
如果一个函数没有返回值,那么需要用void来定义返回值类型,在方法中也可以用return来返回,不执行return下面的代码直接返回。
方法可以在任意位置被调用。
在同一个类中,如果想要调用一种功能,但是由于参数的类型或者参数的个数不同,可能需要不同的方法,这样效率就大大降低,有没有一个办法可以将他们按照类型或者个数区分开呢?这里引进一个方法重载的概念。
·定义:在同一个类中,定义了若干方法名称相同,参数列表不同(参数类型或者参数个数),与返回值无关,这样的一组方法称为重载方法。举例如下:
public static double add(double a,double b){ return a + b; } public static int add(int a,int b){ return a + b; } public static double add(double a,double b,double c){ return a + b + c; } public static int add(int a,int b,int c){ return a + b c; }
这样,在调用时就只用调用add,传入想要传入的参数,会自动根据类型或者个数进行调用。
在JAVA中println就是采用方法重载的方法可以接受所有类型的参数。
·定义:一个方法在执行的过程调用自身,就称为递归。
递归的三要素:
·一个大问题可以拆分成多个子问题
·拆分后子问题和原问题除了数据规模不相同,他们的解决思路完全相同
·需要存在递归出口
例如求一个数num的阶乘:
num!= num * num-2 * num-3 *······*1
拆分为 num * fac(num -1)
终止条件 num == 1
如何写递归?
写递归一定需要注意方法的予以,不要纠结这个递归过程如何实现,不要思考定义(调用自身),考虑调用某种写好的方法。
public class Recursion{ public static void main (String []args){ System.out.println(fac(5); } //递归求阶乘 public static int fac(int num){ //终止条件 if(num == 1) return 1; //拆分问题 //当前已知的时num,不知道num-1! //num - 1 的问题交给fac(num - 1) //拼接答案 return num * fac(num - 1); } }