目录
概念
是对重复出现代码的提取,是一段可以重复使用的代码,用于进行多次调用
语法
访问修饰符 返回值类型 函数名(参数列表){ //操作语句 } public static void 函数名(){}
位置
写在类的内部,其他函数的外部,函数和函数之间不可嵌套定义
调用
函数要想执行,必须在主函数中经过调用
语法
函数名(参数列表); 函数名();
位置
在哪里执行,就在哪里调用
-
程序必然是在主函数中从上往下执行
-
只有当被调用函数执行完毕,调用者本行代码才有可能执行完毕
参数
当函数中存在不确定的因素时,则需要将该因素定义为参数
一个参数
public static void 函数名(数据类型 参数名){ //操作语句 }
形参
形式上的参数,特点为没有具体值,只有定义部分,写在函数的语法定义之中
实参
实际上的参数,特点为是一个具体值或者为拥有具体值结果的表达式,写在函数调用位置的小括号中
使用
-
当函数定义有形参时,在进行函数调用时必须为形参传入对应数据类型的实参
-
执行流程
-
当调用者进入一个有参的函数时,第一步为用实参对形参进行赋值
多个参数
public static void 函数名(数据类型 参数名1,数据类型 参数名2){ //操作语句 }
使用
-
多个参数时,实参的数据类型、个数、顺序必须跟形参定义保持一致
class Day5{ public static void main(String [] args){ //输出一首打油诗,要求:每行输出结束之后打印20个- System.out.println("太阳当空照"); //调用函数打印指定个数的- getLine(20,"-"); System.out.println("花儿对我笑"); //调用函数打印指定个数的* getLine(30,"*"); System.out.println("小鸟说早早早"); getLine(40,"^"); System.out.println("你为什么背上java包"); getLine(50,"."); } //定义一个函数,打印- public static void getLine(int num,String str){ for(int i=1;i<=num;i++){ System.out.print(str); } System.out.println(); } }
返回值
函数的执行结果
public static 返回值类型 函数名(参数列表){ //操作语句 return 返回值; }
return关键字
用于返回函数执行结果
-
如果函数没有返回值,则定义为void
-
当函数定义存在返回值时,必须通过return关键字进行值的返回
-
通常情况下,return语句存在于函数最下方,如果函数中存在分支,则每种分支情况都需要有对应的return结果
-
当函数存在返回值时,调用者必须对函数的返回结果进行处理
-
第一种处理方式:定义变量接收结果,变量类型必须跟函数定义的返回值类型保持一致
public static void main(String [] args){ int sum=getSum(1,2);//接收函数调用结果 System.out.println(sum); } //定义一个函数,传入整形参数n和m,计算n和m的和并返回 public static int getSum(int n,int m){ int sum=n+m; return sum;//return n+m; }
-
第二种处理方式:直接对函数的返回结果进行操作
System.out.println(getSum(2,3));//直接输出函数调用结果
-
-
一个函数的返回结果可以作为其他函数的实参
-
一个函数只能执行一个return语句
-
当函数有返回值时,代码逻辑:(建议)
-
在函数最上方定义用于返回的变量,并设置初始值,变量类型与返回值类型一致
-
书写操作语句,根据不同情况为变量进行重新赋值
-
在函数最下方return返回该变量
-
//定义一个函数,传入整形参数n,判断n是否为偶数并返回,在主函数中测试调用 public static boolean getNumber2(int n){ //1.定义用于返回的变量 boolean boo=false; //2. 书写操作语句,根据不同情况为变量进行赋值 if(n%2==0){ boo=true; } //3. return返回该变量 return boo; }
扩展补充:
return 返回值;用来返回函数的返回值结果
return;可以用来终止程序执行
注意:下方不允许存在其他有效语句
总结
-
函数其实就是提炼一段具有特定功能的代码,特点为可以反复多次调用执行
-
参数其实就是功能代码中不确定的因素
-
返回值其实就是功能代码的执行结果
函数高级
函数的嵌套调用
只要逻辑完整,嵌套层数没有要求
-
当进行函数嵌套调用时,最先执行结束的是最后调用的函数
-
当进行函数嵌套调用时,返回顺序为自下而上,由内往外
JVM内存结构(了解)
-
栈的特点:只能操作栈顶元素,入栈是存放在最顶部,出栈出的也是最顶部元素
-
先入后出
-
-
栈帧:是栈的基本组成元素
-
每当调用一个函数,都会生成一个栈帧,栈帧中存放着函数的所有信息(局部变量、操作语句、返回值等)
-
递归
自己调用自己
-
注意:能用递归实现的内容都可以用循环替代
-
一定要存在最终返回的情况,如果没有,则程序会陷入无限自调用,直到栈帧把内存撑满,程序才会强制停止
//计算某个数字的阶乘并返回 public static int getNumber(int n){//n=5 if(n==1){//当n为1时,证明阶乘计算已经到达底层 return 1;//返回当前1的阶乘值 } return n*getNumber(n-1); /* 1. 5*4*3*2*1 2. n=4 4*3*2*1 3. n=3 3*2*1 4. n=2 2*1 5. n=1 1 */ }