java——函数

函数的概念

函数就是定义在类中的具有特定功能的一段独立小程序,并能被多次使用。
目的是为了提高程序的复用性和可读性。
函数都是在栈内存中运行;运行的函数处在栈顶。

定义功能:

  • 应该是一个封闭的区间。那就需要使用大括号将其封装
  • 需要给这个区间起个名字。以后通过这个名字来调用这个区间
  • 这个区间需要有参与运算的数据
  • 需要定义该功能的结果类型

java如何定义函数

权限修饰符 函数类型修饰符 返回值类型 函数名(参数类型 形式参数1, 参数类型 形式参数2, …){
执行语句;
return 返回值;
}

  • 权限修饰符:指的就是函数的使用范围(内部和外部)(public…)
  • 函数类型:指的就是函数类型分类,说的就是函数的具体使用场景和场合(static…)
  • 函数名:就是程序员给这一段代码自定义的名称(标识符)
  • 参数列表:参数列表有若干个 参数类型,参数名… 组成 主要用于接收外界传递给函数的一些数据
  • 函数体:就是那些具有独立功能的代码块
  • return:仅仅表示结束当前函数,如果有返回值,则函数结束前将返回值返回给调用者
  • 返回值:指的就是这一具有独立功能的代码块的计算结果,需要传递给外界 配合return
  • 返回值类型:就是返回值的数据类型(可兼容)

在这里插入图片描述

函数就是一个功能,功能就需要两部分:

  • 函数运行时有未知参数吗
  • 函数运行完的结果是什么
    定义函数时,时刻把握如下两个明确,基本就可以完成函数的定义:
  • 明确1:这个功能的结果是什么?其实就是明确返回值类型。
  • 明确2:这个功能需要未知内容是什么?其实就是明确参数列表
    注:java中:静态方法没有办法直接调用非静态方法,只能调用静态方法

函数的调用

函数是无法自己执行的,必须通过调用才可以执行
在这里插入图片描述

函数的分类

1.通过有没有参数:

  • 有参函数
  • 无参函数

2.通过有没有返回值

  • 有返回值的函数
  • 无返回值的参数

3.通过定义者

  • 系统函数
  • 第三者
  • 自定义函数
局部变量

局部变量(本地变量):定义在函数中的变量叫做局部变量

函数在内存的调用的本质

每当调用一个方法时,系统会创建一个活动记录(也称为活动框架),用于保存方法中的参数和变量。活动记录置于一个内存去榆中,称为调用堆栈(call stack)。调用堆栈也称为执行堆栈、运行时堆栈,或者一个机器堆栈,常简称为“堆栈”。当一个方法调用另一个方法时,调用者的活动记录保持不动,一个新的活动记录被创建用于被调用的新方法。一个方法结束返回到调用者时,其相应的活动记录也被释放

(1)假如操作系统目前正在执行某一程序,执行到ad0地址
在这里插入图片描述
(2)文本代码才被加载到内存
在这里插入图片描述
(3)对各个函数内的指令进行压栈
在这里插入图片描述
(4)出栈(即指令执行过程)
通过地址总线把各条指令运送到cpu里面运行,每执行一条指令,
栈顶指针就往下移动一个字(一条指令的大小通常指一个字)的大小
在这里插入图片描述
在这里插入图片描述

函数重载(overload)

函数名称相同,函数的参数的个数或者类型不同,调用的时候,自动匹配对应的函数
重载的好处就在于我们可以扩展函数的功能(函数重名,但是参数类型不一样,执行内容也可以不一样)

注:寻找适当函数的流程

  1. 看是否有确切的参数定义 int, int 查看是否有(int,int)
  2. 看是否有可兼容的参数定义 int, int 查看是否有(double,double)
  3. 如果可兼容的参数定义有多个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()//重载了,因为个数不同

在这里插入图片描述
在这里插入图片描述

函数重载所有编程语言都有的吗?

  1. 函数重载现象是强数据类型语言(java、C、C++、C#)所特有的现象
  2. 弱数据类型语言(javascript、python、ruby)是不具备函数重载

函数递归

递归的体现就是函数自身调用函数自身。
一般而言,但凡能够被迭代(循环)解决的问题,递归都可以;递归解决的问题,迭代就不一定了

  • 递归其实是分治法的一种实现方式(一种实现思路)。
  • 先递后归
    前进段:指的就是将问题从大化小
    结束段:问题无法再继续化小,则处理当前的问题
    返回段:将小问题处理完张之后,向上返回(有些问题是不需要返回的)

1.递归就是函数在进栈,进栈的次数多了,势必会占内存,无法避免的

  • 在某些问题上,递归所写的代码要比迭代写的代码少
  • 在某些问题上,迭代是写不出来的,所以只能用递归

递归实现斐波那契数列问题

在这里插入图片描述
在这里插入图片描述

递归实现累加

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值