一,JavaSE中的方法
方法的概述:
简单来说,JavaSE中的方法就是一堆代码的集合,一般用于完成一个特定的功能,使用这个方法就等于使用这个功能。
方法与函数的区别:
函数:函数是一段可重复使用的代码块,用于执行特点的任务并返回一个值。
方法:方法是类或对象的行为或操作,用于执行特定的任务和操作。
方法最大的优点就是 1.代码复用 2.易维护易扩展 3.提高代码灵活度
二,方法的声明
方法的声明:
修饰符列表 返回值类型 方法名(参数列表){
方法体
}
我们拆开一个一个说
2.1 修饰符列表
修饰符列表 : 可有,可没有,可有多个。
权限控制4选一: public , private , protected , 不写即默认权限。
static 表示静态,用于声明静态资源 , 有static表示静态方法,没有static表示成员方法。
注意:多个修饰符,不区分先后顺序。
2.2 返回值类型
返回值类型 : 完成功能后,通过返回值给调用处反馈结果,一般是运算结果。
如果没有返回值,则写void,
如果有返回值,那么需要写返回的数据对应的类型。
返回值可以写11种数据类型 + void(共12种)。
2.3 方法名
方法名符合命名规则即可。
2.4 参数列表
参数列表 : 可以没有,可以有多个,多个用逗号隔开。
() : 无参
(int a ) : 一个参数
(int a , double b) : 多个参数
三,方法分类与调用
方法分类:
1. 静态方法 : 使用static修饰的方法是静态方法
2. 成员方法 : 没有使用static修饰的方法是成员方法
3. 构造方法 : 创建对象使用
方法调用:方法的调用与变量相同
四,方法的入参与出参
参数列表 :
1. 入参,即调用时需要传入相应的数据,当你要完成一件事的时候,需要用到的必要条件,作为入参。
2. 出参 : 返回值,一般是你的打印语句,是出参(运行结果)。
注意:方法不调用不执行,调用才执行,并把结果返回给调用处。
服务端 : 被调用处,只保证功能可行,最终被用在什么地方与我们无关。
客户端 : 调用处,只需要关心入参和出参,功能如何实现的与我们无关。
五,方法重载
两个方法的方法名相同,参数列表不同(1,个数不同;2,类型不同),就是方法重载。
六,内存划分
方法区/静态区 : 用来保存一些静态相关的资源文件,比如加载到内存中的class文件。
栈内存 : 就是以栈数据结构为模型开辟的一块空间,用于执行方法调用。(栈数据结构特性 : 先进后出 , 类似于子弹夹)
栈帧 :栈内存中的数据
栈底元素 : 第一个添加的栈帧
栈顶元素 : 最后一个添加的栈帧
压栈 : 把栈帧放入栈内存的过程
弹栈 : 在栈内存中把栈帧弹出的过程
方法调用,就是在做压栈操作
方法执行结束,就是在做弹栈操作
堆内存 : 保存对象数据(成员)
所以一个class文件中的main方法的执行过程为:
1 把相关class文件载入静态区;
2 调用class中的main方法,在栈内存开辟栈帧;
3 如果main方法中有其他方法调用,则再次开辟对应栈帧;
4 如果方法体顺利执行完,则弹栈,并返回调用处继续执行;
5 如果main方法弹栈,则意味着程序执行结束,JVM关机;
七,递归
递归 : 递归和迭代(循环)是等价的 , 都需要有终止条件,初始值与步长。
递归有两种:
1. 直接递归 : 方法中调用当前方法(自己调用自己)
2. 间接递归 : A调用B , B 调用A
注意:1. 如果没有终止条件,会出现栈内存移出错误 java.lang.StackOverflowError
2. 递归是一种比较消耗内存的一种算法,效率较低,因为需要频繁的压栈弹栈
3. 循环能做的,递归都能做,所以当一件事可以使用循环解决,就一定不要使用递归
4. 递归场景的应用场景 : 树状结构
递归的经典问题 : 阶乘 , 斐波那契数列 , 汉诺塔...