文章目录
一、方法的基本用法
1.什么是方法(method)
方法就是一个代码片段,类似于c语言中的“函数”。
方法存在的意义(重在体会,不需要特别记):
- 是能够模块化的组织代码(当代码比较复杂的时候);
- 做到代码被重复使用,一份代码可以在多个位置使用;
- 让代码更好理解更简单;
- 直接调用现有方法开发,不必重复造轮子。
2.方法的定义语法
//方法定义
public static 方法返回值 方法名称 (方法的形参..[0...N]{
//方法体代码;
[return 语句]
}
方法的调用:返回值变量=方法名称(实参… )
eg定义一个方法,实现两个int的相加
注意事项:
- public 和 static 两个关键字在此处具有特定含义, 我们暂时不讨论, 后面会详细介绍;
- 方法定义时, 参数可以没有. 每个参数要指定类型;
- 方法定义时, 返回值也可以没有, 如果没有返回值, 则返回值类型应写成 void;
- 方法定义时的参数称为 “形参”, 方法调用时的参数称为 “实参”;
- 方法的定义必须在类之中, 代码书写在调用位置的上方或者下方均可;
- Java 中没有 “函数声明” 这样的概念。
3.方法的调用执行过程
基本规则:
- 定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行;
- 当方法被调用的时候, 会将实参赋值给形参;
- 参数传递完毕后, 就会执行到方法体代码;
- 当方法执行完毕之后(遇到 return 语句), 就执行完毕, 回到方法调用位置继续往下执行;
- 一个方法可以被多次调用。
class Test {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("第一次调用方法之前");
int ret = add(a, b);
System.out.println("第一次调用方法之后");
System.out.println("ret = " + ret);
System.out.println("第二次调用方法之前");
ret = add(30, 50);
System.out.println("第二次调用方法之后");
System.out.println("ret = " + ret);
}
public static int add(int x, int y) {
System.out.println("调用方法中 x = " + x + " y = " + y);
return x + y;
}
}
// 执行结果
一次调用方法之前
调用方法中 x = 10 y = 20
第一次调用方法之后
ret = 30
第二次调用方法之前
调用方法中 x = 30 y = 50
第二次调用方法之后
ret = 80
计算5!+4!+3!+2!+1!:
4.实参和形参的关系(重要)
在java中,方法的参数传递只有值传递。所谓值传递就是把实参的值拷贝一份拿给形参,对实参没有任何影响。
eg交换两个整型变量:
刚才的代码, 没有完成数据的交换。对于基础类型来说, 形参相当于实参的拷贝. 即传值调用。
可以看到, 对 a 和 b 的修改, 不影响 x 和 y。
在方法外部交换两个局部变量的场景在java中压根不存在。
这个问题的解决需要引入引用数据类型(数组或对象)。
5.没有返回值的方法
方法的返回值可有可无,没有返回值的方法使用void声明,在没有返回值的方法中,仍然可以使用return;表示提前结束方法的调用。
二、方法的重载
方法重载(overload)和方法重写(override)的区别:
方法的重载发生在“同一个类中”,定义了若干个方法名称相同,参数列表不同(参数的类型或者个数不同)的一组方法,与返回值无关!
这样的一组方法称为重载方法
三、方法递归
1.什么是方法递归
所谓的方法递归就是在一个方法执行的内部,自己调用了自己的过程,称之为“递归”。
递归就分两个子过程:
递过程:函数不断调用自身,直到走到函数的终止条件,第一阶段结束;
归过程:函数不断返回的过程称为归过程。
public void test(){
test()
}
在方法执行过程中再调用了一次方法,就叫方法的递归。
2.什么场景下能用方法递归
三个条件,缺一不可。
3.如何写出递归代码
写递归函数时,千万不要纠结这个函数内部到底咋实现,而要注意这个方法的语义(这个函数到底有什么功能),你就假设,这个方法别人已经写好了,你只是调用这个方法而已。
求一个整数num的阶乘
写出递归代码 = 终止条件 + 不借助任何方法就能实现的步骤 + 剩下的问题利用这个方法去解决
假设这个factor方法别人已经写好了,自己只需要关心如何调用这个方法辅助自己解决问题就好!!
//传入一个整数num就能求出这个num的阶乘值!!!
public static int factor(int num){
//终止条件(不借助任何函数调用的基础上就能直接解决问题)
if(num == 1){
//无需借助任何外部力量,我就知道num=1阶乘值就是1!
return 1;
}
//num>=2
//我只知道num本身的值是多少,至于(num-1)!不知道,交给别的函数 去帮我处理
//调用factor(num-1)=> 能帮我求出(num-1)!
//最后一步,我只需要拼接答案
return num * factor(num - 1)
}
定义一个方法,求出1+2+3+…+num的和是多少:
写一个递归方法,输入一个非负整数,返回组成它的数字之和。例如,输入 1729,则应该返回1+7+2+9,它的和是19:
拆分 => 把一个四位数拆分为1 + 剩下的三位数的和 => 当前三位数7 + 两位数的和 => 当前十位2 => 个位的和
终止条件,所谓终止条件就是不借助任何函数就能直接知道答案的值,当num就是个位数的时候,组成他的各个位数只有自己。
4.递归的执行过程
这就是整个递归函数的微观执行过程。