一、函数的定义
函数主要解决的是那些重复的且具有独立功能的代码段
函数存在的意义---将函数模块化
- 将这些具有独立功能的代码进行再次封装 得到的东西就是函数
- 一个很明显的优势,就是降低了代码冗余复用函数即可,其次是降低了主函数的代码量,将主函数进行适当的拆分,以便内存优化。
函数如何定义的呢?
访问权限 函数类型 返回值类型 函数名(参数列表) {
函数体
return 返回值;
}
- 访问权限:指的就是函数的使用范围(内部和外部)public protected 默认 private
2. 函数类型:指的是函数类型分类
static(静态函数) 默认(成员函数) abstract(抽象函数) native(本地函数) synchronized(同步函数)
3. 函数名:程序员给这一段代码自定义的名称(标识符)
4. 参数列表:由若干个(参数类型 参数名)组成,主要用于接收外界传递给函数的一些数据
5. 函数体:是具有独立功能的代码块
6. return:仅仅表示结束当前函数,如果有返回值,则函数结束前将返回值返回给调用者
7. 返回值:指的就是这一具有独立功能的代码块的计算结果,需要传递给外界,配合return使用
8. 返回值类型:就是返回值的数据类型(可兼容)
接下来我们来分析一下主函数的格式:
public 主函数是公开权限 最大权限
static 主函数是静态函数
void 该函数没有返回值
main 主函数的名称
String[] String[] 表示的是一个字符串数组(数据类型)
args 就是这个数据类型的变量名称
return:如果发现return不在
那是因为函数没有返回值 所以return可以忽略不写 不代表不存在
return本身表示结束当前函数!
如果函数有返回值 return 返回值; 必须写
定义函数的时候 只需要考虑 返回值类型 函数名 参数列表 函数体 返回值
切记:千万不要在函数的内部创建函数 函数必须在类里面 函数们之间是平级关系
在C/C++/Python当中 函数的定义必须在函数调用之前
在Java当中 不限制 之前或之后
我们来看一个例子:
class Test01{
public static void main(String[] args){
int a=4;
int b=4;
double c=pow(a,b);
System.out.println(c);
}
public static double pow(double a,int b){
if(b==0){
return 1;
}
double sum=1;
//2^4
for(int i=1;i<=Math.abs(b);i++){
sum*=a;
}
return b>0?sum:1/sum;
}
public static void show(){
System.out.println("哈哈~~");
}
}
二、函数的分类
- 有返回值有参数
- 有返回值无参数
- 无返回值有参数
- 无返回值无参数
注意:有返回值的函数,参与运算、输出、赋值
无返回值的函数,仅仅调用,并不会对返回结果进行其他操作
三、函数传参
- 实际参数--实参 -->就是在调用函数的时候,给函数传递的数据(常量、变量)
- 形式参数--形参 -->定义函数的时候,参数列表当中的数据
实参是将什么传递给了形参呢---常量在常量池中的地址
---对象在堆内存中的地址
但凡是在函数中创建的变量,称为局部变量。局部变量的作用域仅仅是在当前的函数中
那我用一张图给大家解释一下:
四、函数栈
函数的运行是基于栈运行的
栈,是一个先进后出的容器结构 一段数字按123456的顺序进栈,出栈的顺序就为654321
可以将每一个函数理解为是子弹(函数帧),位于栈顶的函数帧优先运行,主函数是第一个进栈的
接下来我们来看一段代码
class Test01{
public static void main(String[] args){
int a=4;
int b=4;
double c=pow(a,b);
System.out.println(c);
}
public static double pow(double a,int b){
if(b==0){
return 1;
}
double sum=1;
for(int i=1;i<=Math.abs(b);i++){
sum*=a;
}
return b>0?sum:1/sum;
}
}
我用动画给大家演示一下:
希望这篇文章对你有用!!!