函数的概念
函数就是定义在类中的具有特定功能的一段独立小程序,并能被多次使用。
目的是为了提高程序的复用性和可读性。
函数都是在栈内存中运行;运行的函数处在栈顶。
定义功能:
- 应该是一个封闭的区间。那就需要使用大括号将其封装
- 需要给这个区间起个名字。以后通过这个名字来调用这个区间
- 这个区间需要有参与运算的数据
- 需要定义该功能的结果类型
java如何定义函数
权限修饰符 函数类型修饰符 返回值类型 函数名(参数类型 形式参数1, 参数类型 形式参数2, …){
执行语句;
return 返回值;
}
- 权限修饰符:指的就是函数的使用范围(内部和外部)(public…)
- 函数类型:指的就是函数类型分类,说的就是函数的具体使用场景和场合(static…)
- 函数名:就是程序员给这一段代码自定义的名称(标识符)
- 参数列表:参数列表有若干个 参数类型,参数名… 组成 主要用于接收外界传递给函数的一些数据
- 函数体:就是那些具有独立功能的代码块
- return:仅仅表示结束当前函数,如果有返回值,则函数结束前将返回值返回给调用者
- 返回值:指的就是这一具有独立功能的代码块的计算结果,需要传递给外界 配合return
- 返回值类型:就是返回值的数据类型(可兼容)
函数就是一个功能,功能就需要两部分:
- 函数运行时有未知参数吗
- 函数运行完的结果是什么
定义函数时,时刻把握如下两个明确,基本就可以完成函数的定义: - 明确1:这个功能的结果是什么?其实就是明确返回值类型。
- 明确2:这个功能需要未知内容是什么?其实就是明确参数列表
注:java中:静态方法没有办法直接调用非静态方法,只能调用静态方法
函数的调用
函数是无法自己执行的,必须通过调用才可以执行
函数的分类
1.通过有没有参数:
- 有参函数
- 无参函数
2.通过有没有返回值
- 有返回值的函数
- 无返回值的参数
3.通过定义者
- 系统函数
- 第三者
- 自定义函数
局部变量
局部变量(本地变量):定义在函数中的变量叫做局部变量
函数在内存的调用的本质
每当调用一个方法时,系统会创建一个活动记录(也称为活动框架),用于保存方法中的参数和变量。活动记录置于一个内存去榆中,称为调用堆栈(call stack)。调用堆栈也称为执行堆栈、运行时堆栈,或者一个机器堆栈,常简称为“堆栈”。当一个方法调用另一个方法时,调用者的活动记录保持不动,一个新的活动记录被创建用于被调用的新方法。一个方法结束返回到调用者时,其相应的活动记录也被释放
(1)假如操作系统目前正在执行某一程序,执行到ad0地址
(2)文本代码才被加载到内存
(3)对各个函数内的指令进行压栈
(4)出栈(即指令执行过程)
通过地址总线把各条指令运送到cpu里面运行,每执行一条指令,
栈顶指针就往下移动一个字(一条指令的大小通常指一个字)的大小
函数重载(overload)
函数名称相同,函数的参数的个数或者类型不同,调用的时候,自动匹配对应的函数
重载的好处就在于我们可以扩展函数的功能(函数重名,但是参数类型不一样,执行内容也可以不一样)
注:寻找适当函数的流程
- 看是否有确切的参数定义 int, int 查看是否有(int,int)
- 看是否有可兼容的参数定义 int, int 查看是否有(double,double)
- 如果可兼容的参数定义有多个int, int,(double,int)或(int,double) 此时报错 引用不明确
void show(int a,float b,char c){}
下列哪些函数和给定函数重载了
- a.int show(int x,float y,char z)//没有重载,这个函数不允许和给定函数存在于同一个类中。因为会产生调用的不确定性。
- b.void show(float b,int a,char c)/重载了,参数类型不同。
- c.void show(int c,float a,char b)//没有重载,和给定函数一样。不允许存在。
- d.void show(int a,int b,int c)//重载了,因为类型不同。
- e.double show()//重载了,因为个数不同
函数重载所有编程语言都有的吗?
- 函数重载现象是强数据类型语言(java、C、C++、C#)所特有的现象
- 弱数据类型语言(javascript、python、ruby)是不具备函数重载
函数递归
递归的体现就是函数自身调用函数自身。
一般而言,但凡能够被迭代(循环)解决的问题,递归都可以;递归解决的问题,迭代就不一定了
- 递归其实是分治法的一种实现方式(一种实现思路)。
- 先递后归
前进段:指的就是将问题从大化小
结束段:问题无法再继续化小,则处理当前的问题
返回段:将小问题处理完张之后,向上返回(有些问题是不需要返回的)
1.递归就是函数在进栈,进栈的次数多了,势必会占内存,无法避免的
- 在某些问题上,递归所写的代码要比迭代写的代码少
- 在某些问题上,迭代是写不出来的,所以只能用递归
递归实现斐波那契数列问题
递归实现累加