本章目录
1.方法的定义&使用
定义:方法就是C语言中的函数,为了使程序的某项功能可以方便重复使用,而书写一个方法(函数),调用方法(函数)来达到想要执行的目的
我们只需在花括号里输入咱们的方法体即可
比如说我们现在写一个求两个整数和的方法
public static int add(int a, int b){
return a + b;
}
public static void main(String[] args) {
System.out.println(sum(1, 2));
}
方法中的 return a+b 是方法体,在主函数main中直接调用即可
值得一提的是在调用sum方法时传参1和2,由图可知参数前多了字母a与b和冒号,这是编译器自己输入上去的,并不是程序员输入的。
注意:
1.参数的个数必须匹配
2.参数的类型必须匹配
3.参数的顺序必须匹配
接下来说说方法的返回值,有的方法在定义的时候需要传回参数,所以得设置返回值,有的不需要,则不需要设置返回值,根据具体实现的方法来判断是否return方法的结果,return了结果就能使用结果。
在java中,方法有以下注意事项
1.public static 是修饰符,固定搭配
2.方法名用小驼峰命名,numMax
3,. 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
4.方法必须写在类中
5.不能嵌套定义
6,java方法不像C语言的函数,没有函数声明一说,想写在哪个位置都行,main都可以直接调用
2.方法传参
下面讲讲函数中形参与实参的关系
在main中,我们往方法中传入参数,此时main中的参数叫做实参,当我们传入实参给方法后,方法的形参变量会接收到实参,然后对实参进行一份临时拷贝,形参拷贝了实参的值后在方法中进行“加工”,完事后如果有返回值则传回返回值给main,传回后方法中的变量被销毁。
注意:在Java中,实参的值永远都是拷贝到形参中,形参和实参本质是两个实体
因为是临时拷贝,所以方法中的形参无法对实参进行操作
3.方法重载
在介绍方法重载在之前,咱们先思考一个问题:
我们定义一个add方法来计算两个整数的值,那当我们想要计算3个整数的值呢?那得重新定义一个返回a+b+c的值的add2,当我们要定义两个double类型的和呢?又要重新创建一个新的方法名为doubleAdd的方法?如果非要这样,那当我们要调用一些功能类似,但是方法名不一样的方法,这会很麻烦,一会要调用add,一会i又要调用add2,一会还得调用doubleAdd,这就得需要我们记住很多方法的方法名,尽管它们的功能大同小异,都是数字的相加。
为此,如果我们需要避免这种麻烦事发生,我们可以把它们的功能分别用同一个方法名来定义,就相当于我们只要调用同一个方法名,就能使用不同的功能
下面请看代码
public static double add(double a, double b){
return a+b;
}
public static int add(int a,int b,int c){
return a+b+c;
}
public static int add(int a, int b){
return a + b;
}
如代码所示,我们定义3个方法名都为add的方法,编译器却没有报错,我们观察这3个方法,虽然方法名相同,但是参数类型和方法体却不相同,这就叫方法的重载-->就相当与add函数有了3中功能:可计算两个整数和,可计算3个整数和,可计算两个浮点数的和
请看代码的运行结果,用add实现了3中运算,避免了背方法名和查看不同方法名的繁琐
在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了。
方法重载需要以下注意
1. 方法名必须相同
2. 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)
3. 与返回值类型是否相同无关
错误提醒
4.递归
递归就是方法自己调用自己,将条件传递出去(传给自己),又将结果归还回来
递归的条件:
1.在方法内部,自己调用自己
2.在调用自己的过程中要有一个趋近于终止的条件
如果我们不给递归一个终止条件,任其不停的递归下去,程序会出栈溢出的问题
public static void func(){
func();
}
//异常
public static void main(String[] args) {
func();
}
当我们使用递归的时候,为了避免上述问题,一定要确保自己的终止条件的正确性
下面我们来举一个用递归书写的例子
求N的阶乘:输入5 输出1*2*3*4*5
public static int fac(int n){
if(n == 1){
return 1;
}
int tmp = n * fac(n-1);
return tmp;
}
public static void main3(String[] args) {
// fac(4);
System.out.println(fac(4));
}
如图分析递归的过程,红线代表传递的过程,绿线代表遇到终止条件归还的过程
n == 1 是方法的终止条件,n* fac(n - 1) 是方法的递推公式
以上分析可以看出:每次执行到当前方法的一部分时,就去执行另外一部分了
我们要使用递归,就两点方法:
1.找到递推公式
2.找到终止条件
接下来是几个递归练习代码
1.输入1234,输出1+2+3+4
public static int sumEvery(int n){
if(n < 10){
return n;
}
int tmp = n%10 + sumEvery(n/10);
return tmp;
}
2.输入5,输出1+2+3+4+5
public static int sum(int n) {
if (n == 1) {
return 1;
} else {
int ret = n + sum(n - 1);
return ret;
}
}
3.输入整数1234,顺序打印1 2 3 4
public static void print(int n){
if(n < 10){
System.out.println(n);
}else{
print(n/10);
System.out.println(n%10);
}
}
接下来再举例一个特殊例子:斐波那契数列
public static int fib(int n){
if(n == 1 || n == 2){
return 1;
}
int tmp = fib(n-1)+fib(n-2);
return tmp;
}
这是斐波那契数列的递归书写,但是用递归来实现斐波那契数列会做许多重复运算,降低程序效率,当想求的数字越大,程序运行越慢,效率低下
对于斐波那契数列我们选择迭代(循环)的方法来实现,提高程序效率
public static int fib2(int n) {
if (n == 1 || n == 2) {
return 1;
}
int f1 = 1;
int f2 = 1;
int f3 = 0;
for (int i = 3; i <= n ; i++) {
f3 = f1+f2;
f1 = f2;
f2 = f3;
}
return f3;
}
本章完~~