本章, 我来给大家介绍一下什么是函数。首先,让我们来认识函数:
函数存在的意义?
函数主要解决的是那些重复的且具有独立功能的代码段。将这些具有独立功能的代码段可以进行再次封装,得到的就是函数。定义函数降低了代码冗余,将主函数进行适当的拆分,降低了主函数代码量,以便内存的优化。
函数是如何定义的?
函数格式:
访问限权 函数类型 返回值类型 函数名(参数列表){
函数体;
return ;
}
解释:访问限权:指的就是函数的适用范围(内部和外部),如:public 、 protected 、 private;
函数类型:指的就是函数类型分类,如:静态函数(static)、抽象函数(abstract)、本地函数(native)、等;
返回值类型:指的是返回值的数据类型(可兼容),如:void 、int 、double等
函数名:就是程序员给这一段代码自定义的名称(标识符)。
参数列表:参数列表由若干个 (参数类型,参数名) 组成,主要用于接受外界给函数传递的参数。
函数体:就是那些具有独立功能的代码块。
return:仅仅表示结束当前函数,如果有返回值,则函数结束前将返回值传递给使用者。
下面举一个例子来说明:
class Text{
/*
主函数的格式分析
public 主函数是公开权限
static 主函数是静态函数
void 该函数没有返回值
main 主函数的名称
String[] 表示的是一个字符串数组(数据类型)
args 就是这个数据类型的变量名称
*/
public static void main(String[] args){
函数体;
return; //若没有返回值,ruturn可以不写。
//return也表示结束当前函数
}
}
!!函数应在类中定义,不能在函数体内再定义另外一个函数。在C/C++/Python必须在函数调用之前,在Java中在函数调用之前之后都可以。
函数的传参:
实参:在调用函数的时候,给函数传递的数据(常量,变量)
形参:就是定义函数的时候,参数列表里的数据。
接下来我将用图解的方式来解释函数是如何传递参数的:
class text{
public static void main(String[] args){
int A=1;
int B=2;
int C=add(A,B);
System.out.println(C);
}
public static int add(int a,int b){
int c=a+b;
return c;
}
}
首先,这段代码定义了两个函数,一个是主函数,一个是add函数。刚开始是这样子:
当代码执行到 int C=add(A,B) 时,main()函数中A与B变量将内存空间中所存的地址分别复制给了add()函数中a,b变量的内存空间。add()函数中c变量经过计算,从常量池中得到3的地址,然后又将常量3的地址(或者说c变量所存的地址)返回给了主函数中C的内存空间。如图:
函数栈帧:
每一次函数的调用都是一个过程,这个过程我们称之为函数的调用过程。这个过程需要为函数开辟栈空间,用于函数调用中临时变量的保存,保护。这块栈空间我们称之为函数栈帧。
开始解释函数栈帧之前,我们必须知道栈是什么,栈可以比喻为弹夹,当我们装子弹的时候,第一个装的子弹一定是最后一个打出去的,最后装的子弹一定是第一个打出去的,即栈的特点是先进后出,后进先出。
接下来我还是用图解的方式来解释什么是函数栈帧:
class text{
public static void main(String[] args){
int A=1;
int B=2;
int C=add(A,B);
System.out.println(C);
}
public static int add(int a,int b){
int c=a+b;
return c;
}
}
程序在没有执行之前,是这样子的:
接下来执行程序,main()函数先进来,按照编码顺序往下执行,当执行到 int C=add(A,B); 时,add()函数进栈,开始执行add()函数。
当add()函数执行完以后(即执行完return语句后),add()函数将c变量返回给main()函数中的C变量,然后出栈。接下来main()函数继续执行它自己的代码块,当语句执行完后,出栈。
感谢各位大佬的观看!!