函数
一、函数
-
函数:执行特定功能的一段程序代码,同时每个功能被命名,通过名字被重复的使用
-
函数的使用流程:
函数的声明:确定函数的功能,确定函数名 函数的调用:通过函数名直接使用对应功能
-
函数定义的位置:定义在类以内,与main函数并列的位置(类以内,其他函数以外的地方)
-
注意:Java虚拟机运行时,程序的入口永远是main函数
二、函数的定义【开发应用重点】
-
语法:
public static 返回值类型 函数名(形式参数列表){ //函数的实现(函数体) } 函数的三要素:返回值类型、函数名、形参列表 函数的定义:函数的声明和函数实现 声明:public static 返回值类型 函数名(形参列表) 实现:{}--->代表函数具体实现功能的代码
-
函数名
(1)望文生义、驼峰命名法(第一个单词首字母小写,其余单词首字母大写) (2)在目前类中避开重名的函数名
-
形式参数:
(1)语法:在函数定义的()中 public static void 函数名(数据类型 参数名){} (2)应用:形参相当于函数内部的局部变量,可以直接通过参数名在函数内部直接调用 (3)形参的作用:函数和调用者之间的约定,同时用于接受实参传递的数据 (4)形式参数列表的长度:0~n 没有参数的函数称为:无参函数,无需调用者传递任何数据 有参数的函数称为:有参数函数,需要调用者根据参数约定传递实参
-
返回值
(1)返回值类型为:void,代表函数没有返回值,函数无需给调用者返回任何结果 代表没有 return xxxxx; 但是可利用return ;结束当前函数 (2)返回值类型为:8种基本数据类型或是对象类型,代表函数值有返回值,函数必须给调用者返回对应的结果;函数必须有return xxx;语句; (3)return的细节: a.如果return语句用于分支/循环语句中,必须保证每一个分支都有return语句; b.一个函数执行时,只能执行一个return语句,只能执行到return语句 (4)return的作用: a.将函数的返回值返回给调用者 b.结束当前函数
三、函数的调用【开发应用重点】
-
函数调用:通过函数名调用函数,执行对应功能
语法:函数名(); 注意:一个函数通过函数名被多次重复使用
-
带有参数的函数调用;
(1)注意:函数调用时传递的参数被称为实际参数,简称实参 (2)函数名(实际参数) (3)实际参数作用:给形式参数赋值 (4)注意:形参给实参赋值时,数据类型、顺序、个数必须和形参形式一致
-
带有返回值的函数调用
(1)语法: 数据类型 变量名 = 函数名(实参); 注意:接收返回值的变量数据类型取决于函数的返回值类型 (2)返回值处理的几种情况: a.用对应类型的变量接收函数的返回值结果,可以通过变量直接使用返回值结果---->返回值被多次使用时采用此处理方式 b.如果对函数的返回值结果只使用一次,可以直接在使用的地方调用函数 System.out.println(add(3,7)); c.函数有返回值,但是调用者对返回值不做任何处理,后期具体应用场景
//定义一个函数,接收两个数据,并返回两个数据的和,情况a public class Test{ public static void main(String[] args){ int s = add(3,7); System.out.println(s); if(s%2==0){ System.out.println("3和7的加和是10"); } public static int add(int a,int b){ int sum = a+b; return sum; } } }
//情况b(只使用一次) public class Test{ public static void main(String[] args){ System.out.println(add(3,7)); public static int add(int a,int b){ int sum = a+b; return sum; } } }
//情况c,不调用 public class Test{ public static void main(String[] args){ add(3,7); } public static int add(int a,int b){ int sum = a+b; return sum; } } }
//例:定义一个函数,select接收两个整数,判断两个整数的和是否大于20小于50,是 返回true,否 返回false public class Test{ public static void main(String[] args){ boolean r = select(23,20); System.out,ptintln(r); } public static boolean select(int a, int b){ int sum = a+b; if(sum>20 && sum<50){ return true; }else{ return false; } } }
//例2:定义一个函数test,接收三个整数,将最大值返回 public class Test{ public static void main(String[] args){ System.out.println(test(3,7,3)); } public static int test(int a,int b,int c){ int max=a; if(max<b){ max=b; } if(max<c){ max= c; } return max; } }
四、函数的作用【了解】
-
减少代码的冗余
-
提高代码的复用性
-
提高代码的可读性
-
提高代码的维护性
-
便于分工,协同开发
public class Test{ public static void main(String[] args){ System.out.println("123546"); m1; //一旦发生函数的调用,需要先执行被调函数内部的代码;执行结束或是遇到 System.out.println("1234567"); //return语句时,则返回到调用位置 } public static void m1(){ System.out.println("012"); System.out.println("456"); } }
五、函数的嵌套调用
-
概念:在被调用函数内部调用了其他函数,这种调用现象被称为函数的嵌套调用
-
执行原理:程序在执行过程中,遇到函数调用,则优先执行被调函数内部的代码,被调函数执行结束或是遇到return,则返回到调用位置(有返回带着返回值回到调用位置),继续执行函数调用后续程序代码。
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ntzmZLH-1641285288251)(C:\Users\31999\Desktop\预热资料\1.jpg)]
-
内存:
(1)栈空间:描述函数/方法的调用模型,一个函数被调用会在栈空间分配对应的栈帧(stact fram)空间,每个函数的栈帧空间记录在此函数中,局部变量表、操作数栈、函数出口等信息,函数调用一旦结束,则对应栈帧空间也一并被收回
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M0oh6lLV-1641285288253)(C:\Users\31999\Desktop\预热资料\2.jpg)]
七、递归
-
递归:在一个函数中自己调用自己的函数,这种调用机制叫做递归
-
如果递归调用时,没有为调用设置一个出口,则会出现无穷递归的现象
无穷递归一旦出现,则栈空间会被占满,则栈溢出,则Java虚拟机(jvm)会停止工作,报错
-
递归思想
(1)递进:每一次的递进都比上一次要简单,直到简单的不能再简单为止,找到对应的出口 (2)回归:基于出口,逐层往回返,直到递进的最顶层
//计算5的阶乘 public class Test{ public static void main(String[] args){ //计算5的阶乘 System.out.println(jieCheng_5(5)); } // 计算5的阶乘 public static int jieCheng_5(int n){ return n*jieCheng_4(n-1); } //计算4的阶乘 public static int jieCheng_4(int n){ return n*jieCheng_3(n-1); } //计算3的阶乘 public static int jieCheng_3(int n){ return n*jieCheng_2(n-1); } //计算2的阶乘 public static int jieCheng_2(int n){ return m*jieCheng_1(n-1); } //计算1的阶乘 public static int jieCheng_1(int n){ return 1; } }
//将上述代码可以简化成如下代码: public class Test{ public static void main(String[] args){ System.out.println(jieCheng(5)); } public static int jieCheng(int n){ if(n==1) return 1; return n*jieCheng(n-1); } }
-
递归案例:递归解决阶乘问题
public class Test{ public static void main(String[] args){ System.out.println(fact()); } public static int fact(int n){ if(n==1) return 1; int result = n*fact(n-1); return result; } }