引言
函数它是面向过程编程思想的一种产物,把大的复杂的业务功能拆分为若干子模块,从而简化开发,各个子模块有由各个函数构成。在面向对象实现通常称为方法。

一.函数的概念

函数是一个数学中的概念,y=kx+b; 描述的是 因变量随着自变量改变而改变。程序中的函数,是在一个特定功能的语句集合,这些语句可以被重复使用。

二.定义函数语法

2.1 语法规则

public static dataType|void functionName( [类型 变量名,…,类型 变量名] ){
封装的语句;
[return xx;]
}
根据业务功能确定函数名字 。
根据是否需要返回数据 来确定 返回值类型,dataType与void 二选一,不可同时存在,dataType可以是任何数据类型。
根据是否需要接收外部数据 来确定参数。
如果声明了返回值类型,则必须有return 一个值,如果声明了void 则不可return 一个值,但是可以单独使用return,表示立即终止函数执行。

函数定义的位置在 class 内部,main平级。

2.2 一个简单的函数

  1. public static void sayHello( ){
  2. System.out.println("你好");
  3. System.out.println("你今天吃了吗?");
  4. }

三. 函数调用

当函数定义以后,并不会主动执行,需要被调用才会执行。调用一个函数回进入到函数内部执行里面的代码,执行完毕后会回到调用语句的下一行继续执行。

3.1 调用语法


//

  1. public static void main(String[] args) {
  2. sayHello();
  3. sayHello();
  4. }

如果本类调用直接 通过函数名字调用 ,如果跨类调用,需要通过类名.函数名

3.2 函数调用的本质

函数调用本质实际上是一个压栈的操作,一个函数被调用,则被压入到对应线程的执行栈中,每一个方法为一个栈帧。
image.png

四.形参与实参

4.1 概念解释

形参:就是函数需要外部提供的数据,定义函数时,在形参列表()小括号 中声明,与声明普通变量无异,它属于函数的局部变量,可以在函数体内使用。形参在函数执行前是没有具体值的,只有运行期间,函数被调用,才会被赋予具体的值。一旦函数执行完毕形参也就被回收了。
实参: 实参就是函数调用时,调用者提供的数据。

4.2 如何确定函数的形参

这个问题需要开发者自己考虑,因为函数本身就是开发者自己设计的程序,那么这个函数否存在形参,完全取决于业务功能,和开发者的想法。所以这里并没有具体答案。
我们要做到的就是不多不少刚刚好,合情合理即可。

4.3 传递实参的要求

实参类型 个数 顺序 要和形参一致。

五.返回值

返回值指的是一个函数执行完毕后 返回个调用者的数据,如果要想一个函数可以具备返回数据的能力,那么在设计的时候就要考虑。如果需要返回数据,那么在函数声明定义时就需要指定返回值的类型,不能使用void ,而是指定一个具体的数据类型,这类型一定要和你实际返回的数据类型一致,否则报错。

调用一个存在返回值的函数,通常一定要接收这个返回数据,接收数据使用一个变量接收,这个变量的类型也要和 返回数据的类型 一致(兼容)。
在返回值类型为 void 的函数中,如果可以使用 单独的 return ,不能用作返回数据,可以做为终止函数的作用。
如果一个函数有返回值,且内部使用了 分支比如if, 那么必须保证,程序的每条执行路径都有 return 语句的覆盖。

六.递归

6.1 概念

程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法。
它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的能力在于用有限的语句来定义对象的无限集合。
递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

6.2 使用递归

/*
封装一个计算指定数的阶乘
*/
public static int jc( int n ){

  1. if( n== 1 ){
  2. return 1;
  3. }
  4. return n * jc(n-1);
  5. //Exception in thread "main" java.lang.StackOverflowError
  6. // 栈溢出,
  7. }

6.3 递归案例

  1. // 1 1 2 3 5 8 13 21 34 55.... 斐波那契数列
  2. //编写一个函数计算 指定项的数列值 : f(n) = f(n-1)+ f(n-2)
  3. public static int f( int n ){
  4. //退出
  5. if( n == 1 || n== 2 ){
  6. return 1;
  7. }
  8. return f( n - 1) + f( n-2 ); // 任意项看成 这一项 前两项的和
  9. }