方法
方法是java中常见的东西,比如:
System.out.println();
上面这一行中System是‘类’,out是‘对象’,println是‘方法’。
首先我们要记住一个方法只能实现一个功能,上面这一行就是只能实现输出语句这一个功能。
我们可以打一个例子1:
public static void main(String[] args) {
}//基础的main方法
//在main方法之外建立一个方法
public static int add(int a,int b){
return a+b;//return是方法的结束后的返回值,这里的返回值就是a+b。
}
方法调用
我们写好了一个方法后,我们要在main里面去调用它,通过上面例子1写的方法,我们可以输入以下:
public static void main(String[] args) {
int c = add(1,2); //定义一个变量c,使用下面创建的add方法,计算1+2的和。
}
}
public static int add(int a,int b){
return a+b;
这样我们就可以使用新创建的方法了,上面调用方法的语法就是int c =方法名(实际参数1,实际参数1);我们在之后调用方法就可以以此类推。
在使用中要明白方法是解决一类问题的步骤的有序组合并且方法包含在类或者对象中,方法在程序中被创建,在其他地方被引用。
方法的定义
修饰符 返回值类型 方法名 (参数类型,参数名){
方法体
return 返回值;
}
方法的语法就是这个样子,例如刚刚的代码我们就可以改造一下
public static int add(int a,int b){
int c=0
if(a>b){
c=a;
System.out.println(c);
}else{
c=b;
System.out.println(b);
}
return c;
}
我们可以看到,上面这一行代码中public是修饰符,int是返回值类型,add是方法名,int是参数类型,a是参数名称,中间的if循环是方法体,return c是返回值。
我们总结一下
- 方法体是一个代码片段,包含具体的语句,定义方法的功能
- 方法包含一个方法头和方法体
- 修饰符可以选择要或者不要,用来定义方法的访问类型
- 返回值类型是返回值的数据类型,如果不需要返回值,上面的代码便是:**public static void int add(){}**这个样子
- 方法名是方法的实际名称
- 当方法被调用时,传递值给参数,这个值被称为实参,参数列表是值方法的参数类型,参数是可选的,方法中可以不包含参数
- 实际参数和形式参数不同,形式参数是在方法被调用时接受外界输入的数据,而实际参数是调用方法时实际传递给方法的参数。 比如上面改造后的例子1,里面的a,b就是形式参数,而main里面的1,2就是实际参数。
- return 0;是终止方法的符号,比如在方法体中我们可以在一个语句之后不想在运行这个方法,将return 0;加入进去,就会终止方法的运行。
方法的重载
重载是在一个类中有相同的方法名,但是其中的形式参数不同,比如以下的例子2:
public static int add(int a,int b){
return a;
}
public static double add(double a,double b){
return a;
}
上面就是方法的一个重载,我们在main里面输入
public static void main(String[] args) {
int a=add(1,2);
int b=add(1.0,2.0);
}
我们可以看到a和b都调用了add方法,但是a的实际参数是1,2是整数,而b的实际参数是小数,所以a调用的是int类型的add而b调用的是double类型的add。
那么关于重载我们需要注意重载的方法名称相同,但是参数列表不同
当方法名称相同时,我们的编译器会根据带哦用方法的参数个数,参数类型等去匹配选择对应的方法,如果匹配失效就会报错
可变参数
可变参数也可以称为不定项参数,可以在里面传递很多个参数,但是我们只能指定一个可变参数,并且是最后一个参数
public static int add(int...a){
return a;
}
这个上面的int…a就相当于是一个数组,因为我们不确定会有几个int类型的实际参数传递过来,所以使用可变参数后,不管传递了多少个Int类型的实际参数都可以被接收。
递归
不同于之前的方法调用,递归是方法本身调用自己本身
但是在使用递归时要注意,需要有**递归头:决定什么时候不调用。递归体:什么时候调用自己。**如果没有递归头,就会陷入死循环。
比如下面的例子:
public static void main(String[] args) {
System.out.println( pas(5));
}
public static int pas(int a){
if(a==1){
return 1;//递归头
}else{
return a*pas(a-1)//递归体;
}
}
首先,return 1;这一行是递归头,代表着程序在等于a=1的时候结束循环,是一个边界条件。之后我们可以看到a的实际参数时5,所以当5这个数字进入我们的pas方法后,执行else里面的代码,5*(5-1),但是之后这个a-1这个数字会重新进入我们的方法pas中,一直到a变成1后才会结束循环,之后每一个循环都会有一个值,这些值执行递归体的代码进行运算。
这段代码里面,在将a=5一步步循环到a=1之后,就会有一个确定的值为,然后再将这个值返回到a[2]里面,返回之后又会有一个确定的值,这个值再返回到a[3]里面,以此类推,之后a[5]的值就会返回到我们的main方法里面来输出这个值。
但是,递归这种方式比较占用内存,在平时使用时,当所计算的基数比较小时,使用递归会更快一些。并且我们一定要有递归头来决定什么时候结束调用自身的方法