目录
函数就是定义在类中的具有特定功能的一段独立小程序,并能被多次使用。具有名称的特定功能代码的集合。
提高代码的复用性,减少代码的维护成本。
权限修饰符 [函数类型修饰符] 返回值类型 函数名([参数类型 形式参数1, 参数类型 形式参数2, ...]){ 执行语句; [return 返回值;] }
注意:在Java中,函数是定义在类中,是类的成员
当函数定义完成后,不会自己执行,需要通过调用来执行
函数名称([实际参数列表])
如下实现了一个打印Hello的函数:
public class Function { public static void main(String[] args) { // 调用函数 printHello(); } // 定义一个函数 // static 关键字的作用是将函数提前加载到内存中 public static void printHello() { System.out.println("Hello"); } }
1. 通过函数是否存在参数
2. 函数是是否需要返回计算结果
定义在函数内部的变量,叫做局部变量,局部变量的作用域只在当前函数中有效
注意:在Java中没有全局变量,main函数中的变量也是局部变量,只是比较特殊
作用域还是main函数本身,但是声明周期是比较长
public class Function { public static void main(String[] args) { // 调用函数 printHello(); System.out.println(a); // 错误: 找不到符号 } // 定义一个函数 // static 关键字的作用是将函数提前加载到内存中 public static void printHello() { int a = 10; System.out.println("Hello"); } }
在上述的代码中,函数printHello()中的变量就是局部变量。当在主函数中调用时,会报错。
函数本质是一个对象,存储在对中,当调用时,会临时的压入栈中(push),等调用完成后,函数被弹出栈(pop)。所以函数调用就是瞬时操作。
调用函数 ==> 函数压栈 ==> 函数调用完 ==> 函数出栈
函数的运行原理:
每当调用一个方法时,系统会创建一个活动记录(也称为活动框架),用于保存方法中的参数和变 量。活动记录置于一个内存去榆中,称为调用堆栈(call stack)。调用堆栈也称为执行堆栈、运行时堆 栈,或者一个机器堆栈,常简称为“堆栈”。当一个方法调用另一个方法时,调用者的活动记录保持不 动,一个新的活动记录被创建用于被调用的新方法。一个方法结束返回到调用者时,其相应的活动记录也被释放。
函数重载(overload):至少两个或者更多函数,函数名称相同,但是参数的个数或者类型不同,从而在调用的时候,可以通过传参确定要调用的函数
public class OverLoadTest { public static void main(String[] args) { System.out.println(add(10, 20)); // 30 byte a = 10; System.out.println(add(a, 10)); // 20 System.out.println(add(10)); // 110 } public static int add(int x, int y) { return x + y; } // 错误: 已在类 OverLoadTest中定义了方法 add(int,int) // public static int add(int a, int b) { // return a + b; // } public static int add(byte a, int b) { return a + b; } public static int add(int a) { return a + 100; } }
函数重载,本质是对功能的扩展,不是代码的复用!!!
递归:函数自身调用自身
如果要使用递归:必须有终止条件,没有终止条件的递归就是一个死循环!!
public class RecursionTest { public static void main(String[] args) { int s = sum(100); System.out.println(s); // 5050 int n = sum1(100); System.out.println(s); // 5050 } public static int sum(int n) { return n * (1 + n) / 2; // 等差数列 } public static int sum1(int n) { return n + sum(n - 1); // 递归 } }
除次之外,我们还可以使用for循环去实现。
再如,
import java.util.Scanner; public class RecursionTest1 { // 输入一个数n,输出斐波那契数列的第n项值 public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.print("请输入项数:"); int n = scan.nextInt(); int result = fibonacci(n); System.out.println(result); fibonacci1(n); } public static int fibonacci(int n) { if (n == 0) { return 0; } if (n == 1) { return 1; } return fibonacci(n - 1) + fibonacci(n - 2); } public static void fibonacci1(int n) { int frist = 0; int second = 1; int three = 0; for (int i = 2; i <= n; i++) { three = frist + second; frist = second; second = three; } System.out.println(three); } }
函数fibonacci是一个递归函数,而fibonacci1函数是一个使用for循环去实现这个题目的方法。