上一篇文章,我大概带大家了解了一下函数,这次,我来详细的介绍下函数
函数的分类
我就先来说一下函数的分类,函数根据返回值和参数大致可以分为以下几位:
- 有返回值有参数
- 有返回值无参数
- 无返回值有参数
- 无返回值无参数
这里我们要注意几点:
有返回值的函数,主要用于参与运算、输出、赋值,等地方。
但是如果是无返回值的函数,那就仅仅调用而已,不能参与运算。
函数传参
函数的传参也分为几类
- 实际参数-实参
实际参数就是在调用函数的时候,给函数传递的数据(常量,变量),我们把这种叫做实参 - 形式参数-形参
形式参数就是定义函数的时候,参数列表当中的数据,我们把他叫做叫做形参
那我们就有一些小问题了:实参是将什么东西传递给了形参?
通常被传过去的就是:常量在常量池中的地址和对象在堆内存中的地址
局部变量
局部变量是什么呢?大体来说但凡是在函数中创建的变量,我们就称之为是局部变量,局部变量有一个作用域,局部变量的作用域仅仅在当前的函数当中。
那局部变量在函数里是什么呢?
一般来说,形式参数一定是局部变量。
函数栈
我们都知道,函数的运行是基于栈内存的,栈是一个先进后出的一个容器结构。
这是我自己画的一个图,我们可以把栈看成是子弹,玩过fps游戏的都知道,子弹是按顺序123456进栈,也是按顺序出栈654321,栈也是这个顺序。
我们可以将每一个函数理解为是子弹(函数帧/栈帧),位于栈顶的函数帧优先运行的
那么在我们的程序中,主函数绝对是第一个进栈的.
return结束当前函数 ,这就表示的是当前函数弹栈,从这个栈出去。
函数的重载
什么是函数的重载?
函数的重载指的就是同一个类中出现的同名函数,这个函数与权限没关系,与返回值类型没关系,与参数名没关系,只有和参数类型的排列组合有关系(注意一下参数类型的向下兼容问题)
我用一串代码可以给你说一下:
class Test01{
public static void main(String[] args){
int a=3;
int b=4;
System.out.println(add(a,b));
double d=3.14;
double e=5.44;
System.out.println(add(d,e));
System.out.println(add(3,3.14));
System.out.println(add(3.13,9));
}
//对两个小数进行加法运算
public static double add(double c,double d){
return c+d;
}
public static String add(String a,String b){
System.out.println("String+String");
return a+b;
}
public static double add(int a,double b){
System.out.println("int+double");
return a+b;
}
public static double add(double a,int b){
System.out.println("double+int");
return a+b;
}
public static double add(double a,double b){
System.out.println("double+double");
return a+b;
}
//对两个整数进行加法运算
public static int add(int a,int b){
System.out.println("int+int");
return a+b;
}
}
这串代码就是函数的重载:重载的好处就在于我们可以扩展函数的功能(函数重名,但是参数类型不一样,执行内容也可以不一样)
但是函数重载总有个先后顺序,这就是程序寻找适当函数的流程:
1.看是否有确切的参数定义 int+int 查看是否有(int,int)
2.看是否有可兼容的参数定义 int+int 查看是否有(double,double)
3.如果可兼容的参数定义有多个int+int,(double,int)或(int,double) 此时报错 引用不明确
这都是要注意的使用方法,扫不注意,就有可能报错,不能有引用不明确的参数,这就是函数重载。
今天的分享到此结束,感谢您的阅读,点个赞行不行。