概念
函数是一点具有特定功能的代码,特点为可以在不同的位置多次调用执行。可以解决代码冗余问题。
语法
访问修饰符 返回值类型 函数名(形参列表){
//操作语句
}
example:
public static void 函数名(){
//操作语句
}
位置
函数一般都写在类的内部,其他函数的外部,与主函数同级。
调用
自定义函数想要执行必须经过调用。
调用方法:在其他函数中通过函数名(实参列表);或函数名();进行调用,需要在哪里使用就在哪里调用,位置不做限制。
//案例:
public class Test {
public static void main(String[] args) {
//输出一首打油诗,要求每行之后输出15个-
System.out.println("太阳当空照");
//调用函数输出-
printLine();
System.out.println("花儿对我笑");
printLine();
System.out.println("小鸟说早早早");
printLine();
System.out.println("你为什么背上java包");
printLine();
}
//书写函数,输出指定数量的-
public static void printLine(){
//利用循环输出-
for (int i = 1; i <= 15; i++) {
System.out.print("-");
}
System.out.println();
}
}
参数
表示函数中的不确定因素,提高函数的泛用性。
形参
形式上的参数。没有具体值,只有声明部分,写在函数声明处的小括号内
实参
实际上的参数。有具体值(或是有具体值结果的表达式),写在函数调用处的小括号内。
一个参数
语法:
形参:
public static void 函数名(数据类型 参数名){
//操作语句
}
实参:
函数名(值);
注意:当存在形参时,必须使用实参给形参赋值
多个参数
语法:
public static void 函数名(数据类型 参数名1,数据类型 参数名2,..){
//操作语句
}
调用:函数名(值1,值2,..)
使用规范:实参列表必须和形参列表保持一致。(参数列表:数据类型、个数、顺序)
形参不可同时声明,必须分开独立声明。
public static void method(int a,int b){}//正确
public static void method(int a,b){}//错误
案例:
public class Test {
public static void main(String[] args) {
//输出一首打油诗,要求每行之后输出-
System.out.println("太阳当空照");
//调用函数输出- 10
printLine(10,"-");
System.out.println("花儿对我笑");
//15 *
printLine(15,"*");
System.out.println("小鸟说早早早");
//20 +
printLine(20,"+");
System.out.println("你为什么背上java包");
//25 #
printLine(25,"#");
}
/**
* 书写函数,输出指定数量的内容
* @param n -的数量
* @param str 输出的内容
*/
public static void printLine(int n,String str){
//利用循环输出-
for (int i = 1; i <= n; i++) {
System.out.print(str);
}
System.out.println();
}
}
返回值
是一个具体值,特点为可以向上(调用者)返回。
public static 返回值类型 函数名(形参列表){
//操作语句
return 值;
}
example:
public static void main(String[] args) {
//定义变量接收返回值
int sum=getSum(100);
//判断结果是否为偶数并输出
System.out.println(sum % 2 == 0 ? "偶数" : "不是偶数");
}
//定义一个函数,传入整型参数n,要求计算1-n的和,并调用测试,并在调用完成后判断和是否为偶数
public static int getSum(int n){
int sum=0;//累加器
for (int i = 1; i <= n; i++) {
sum+=i;
}
//将和向上返回
return sum;
}
使用特点及规范:
1. void:没有返回值,无需向上返回数据。
2. 如果函数声明有返回值,则函数内部必须通过return语句将值向上返回。
3. 当调用一个拥有返回值的函数时,调用者必须对返回的数据进行后续处理,否则返回值无意义。
4. 同一直属作用范围内,return语句下方不可存在其他有效语句,无法执行。(return代表程序执行到此处就结束了,下方语句不会继续执行)
5. 如果函数中存在分支,则必须保证每种情况下都有可被执行的return语句。
//定义一个函数,传入整型参数n,判断n的奇偶性,如果为偶数则返回true,否则返回false
public static boolean isOu(int n){
if (n % 2 == 0) {
return true;
}
return false;
}
6.当分支情况较多时,为了方便记忆,建议使用 “三部曲”。
1. 在函数最上方定义用来返回的变量,并赋初始值。
2. 在函数操作语句中根据不同的情况为变量重新赋值。
3. 在函数的最下方return该变量。
函数高级
函数的嵌套调用
1. 函数嵌套调用时,调用顺序与执行结束的顺序相反
2. 当调用的函数执行结束,调用者才有可能执行结束
3. 只要逻辑完整,嵌套层数不做要求
JVM的内存结构
JVM内存主要有栈和堆组成。栈的特点是,先进后出(FILO),永远操作栈顶元素。每当函数调用时,都会生成一条对应的栈帧,栈帧的执行特点决定了函数嵌套调用的执行特点。
递归
函数之间循环调用。
使用特点:当进行递归调用时,会持续生成栈帧,如果没有跳出条件,则最终栈帧会将内存撑满,程序会强制停止。return可以强制停止程序剩余内容的执行,可以用于递归,在递归过程中满足某个条件时通过return;结束递归。
递归可以实现的操作,循环一定也可以。
重点掌握
-
函数的完整语法
-
形参和实参的区别
-
什么是参数列表
-
返回值的使用