1.什么是函数
在Java中函数也叫方法,它是一段代码,这段代码可以实现某种特定的功能,并且能被反复调用
定义函数格式
访问修饰符 函数返回值类型 函数名称 ([ 参数列表 ]) [ throws 异常列表 ] {函数体;[ return 返回值 ; ]}
public class test() {
public static void main(String[] args) {
returnNumber;
}
public void returnNumber() {
Scanner sc = new Scanner();
int num = sc.nextInt();
System.out.println(num);
}
}
//输出结果为8
函数执行原理
首先会把 main 方法压入到栈中,然后再把 returnNumber() 压入到栈中,由于reutrnNumber() 方法是在栈 顶,因此这个方法也是当前程序要执行 的方法。在执 行 这个方法时,会在堆中创建 Scanner 对象,并把 sc 这个变量 放到局部变 量 表中。而这个表中维护的就是这个方法运 行 过程中的变 量 。当 returnNumber()方法执行 完后,会把栈顶中的 returnNumber()变 量 弹出栈,从而 main 就变为了栈顶元素,因此接下就要 继续执行 main 方法,直到程序结束。
2.方法重载
public class OverrideDemo {
public static void main(String[] args) {
// 需求:计算指定数的加法操作
int r = add(2, 3);
System.out.println(r); //5
r = add1(2, 3, 4);
System.out.println(r); // 9
}
public static int add(int a, int b) {
return a + b;
}
public static int add1(int a, int b, int c) {
return a + b + c;
}
}
由上方法可以看出,相同的功能因为变量的不同使用了多个方法,而命名对于我们来说特别困难,
// 使用重载解决上述问题
public class OverrideDemo {
public static void main(String[] args) {
//需求:计算指定数的加法操作
int r = add(2, 3);
System.out.println(r); // 5
r = add(2, 3, 4);
System.out.println(r); // 9
}
public static int add(int a, int b) {
return a + b;
}
public static int add(int a, int b, int c) {
return a + b + c;
}
}
通过运行代码,发现输出的结果是一样的,解决了需要命名不同的方法名称的问题
方法重载的特点(面试重点)
1.方法重载是发生在同一个类中
2.方法名称必须相同
3.参数列表必须不同,参数列表包括参数类型、参数个数、参数顺序,三者任意一个不同即可
4.与返回值类型无关
3.递归
什么是递归
所谓递归就是自己调用自己
递归调用很容易死循环,因此需要在递归中一定要有一个出口来退出循环
递归算法的局限性
递归算法不能使用到大的数据量,因为大的数据量容易产出内存的溢出,原因是递归算法会不停的执行进栈操作
递归的使用
使用递归计算阶乘
public class RecursiveTest{
public static void main(String[] args) {
int result = recursive(5);
System.out.println(result);
}
public static int recursive(int n) {
if (n == 1) return 1;
else return n * recursive(n - 1);
}
}
使用递归实现累加
public class RecursiveTest2 {
public static void main(String[] args) {
int result = add(5);
}
public static int add(int n) {
if (n == 1) return 1;
else return n + add(n - 1);
}
}
使用递归实现斐波那契数列
public class RecursiveTest3 {
public static void main(String[] args) {
fib(20);
}
public static int fib(int n) {
if (n == 1 || n == 2) return 1;
else return fib(n - 1) + fib(n - 2);
}
}