一、方法
1.1 概述和作用
方法:一堆代码的集合,使用这个方法,就等于使用这些命令
优点:
- 使程序变的更加简洁,可读性较强
- 有利于维护和扩展
- 提高代码复用,提高开发效率
- 提高程序灵活度
方法,不调用不执行,调用才执行,并把结果返回给调用处
1.2 方法声明
语法:修饰符列表 返回值类型 方法名(参数列表){方法体}
解释:
修饰符列表:
可以有,可以没有,可以有多个
权限控制 : public private protected 不写 四选一
其他: static 静态 ,final 最终,abstract 抽象,…返回值:
11种数据类型中的任意一种,如果没有返回值,则写void
方法名:
符合命名规则即可
参数列表:
没有参数又称为无参,多个参数 用逗号隔开
要做一件事,需要用到的必要的未知数
参数列表中的变量为局部变量方法体:
{},功能代码
return:
- 终止方法执行
- 返回数据
- 如果方法有返回值,那么方法体中必须有return语句 返回数据并终止执行;
- 如果没有返回值,那么return可以加可以不加,就算加,也只能终止执行
1.3 方法分类
- 静态方法:使用static修饰
- 成员方法:没有使用static修饰
- 构造方法:用于创建对象使用
1.4 方法调用
- 静态方法调用: 类名.静态方法名(参数)调用,如果是调用当前类中的静态方法,类名可以省略
- 成员方法调用:对象.成员方法名(参数)调用
- 方法不调用不执行,调用才执行,并把结果返回给调用处
1.5 入参出参
- 入参:参数列表(做完一件事后,需要返回的数据,是入参,一般是你的打印语句)
- 出参:就是返回值(做完这件事后用到的未知数,就是入参)
public static void main(String[] args) {
// m1();
// m2(4);
m3(1, 100);
// 接收返回值
int reult = m4(1, 100);
System.out.println(reult);
}
// 需求 : 打印1~10
public static void m1() {
for (int i = 1; i <= 10; i++) {
System.out.println(i);
}
}
// 需求 : 打印1~N
public static void m2(int n) {
for (int i = 1; i <= n; i++) {
System.out.println(i);
}
}
// 需求 : 计算 n~m的值,并打印 , 假设 n小于等于m
public static void m3(int n, int m) {
int sum = 0;
for (int i = n; i <= m; i++) {
sum += i;
}
System.out.println(sum);
}
// 需求 : 计算n~m的值并返回 , 假设 n小于等于m
public static int m4(int n, int m) {
int sum = 0;
for (int i = n; i <= m; i++) {
sum += i;
}
// System.out.println(sum);
return sum;
}
1.6 方法重载
重载目的:相同功能,相同名字,方便记忆,书写方便
方法重载:方法名相同,参数列表不同(1. 个数不同, 2. 类型不同)
二、栈内存
* java 中的内存划分和管理
*
* java Runtime Data Area : java 运行时区域,一般叫JVM内存
*
* 被分为五大块区域 : 程序计数器 , 方法区/静态区 , VM栈内存 , 本地方法栈 , 堆内存
*
* 程序计数器 : 是一块较小的空间,主要保存该线程执行的行号
*
* 方法区 : 保存静态资源文件,包括运行的class文件
*
* VM栈 : 以栈数据结构为模型开辟的一块空间,用于执行方法调用
* 栈数据结构 : 先进后出
*
* 栈帧 : 栈空间中的元素数据,称为栈帧
* 栈顶元素 : 最后一个添加的栈,在最上面
* 栈底元素 : 第一个添加的栈,在最下面
*
* 压栈 : 把栈帧放到栈空间的过程
* 弹栈 : 把栈帧在栈空间弹出的过程
*
* 本地方法栈 : 用于执行本地方法,不用管
*
* 堆内存 : 保存对象及数组
*
*
* 过程 :
*
* 编码,得到.java文件 , 然后进行javac编译,生成class文件 , 通过java命令执行class文件
*
* 1 开启jvm虚拟机,然后把相关class文件载入到JVM内存中的方法区
*
* 2 调用class中的main方法,在栈内存开辟栈帧
*
* 3 执行main方法,如果main方法中没有其他引用,执行完后,JVM关闭
*
* 4 如果main方法中有其他方法引用,则再次创建新的栈帧来执行新方法(如果该方法是其他类中的,则需要先把相关类加载方法区)
*
* 5 如果被调用方法中,还有其他方法调用,则继续创建新栈帧
*
* 6 直到所有栈帧执行完毕,最后执行完毕main方法,则运行结果,JVM关闭
三、递归
3.1 使用
直接递归: 自己调用自己,在当前方法中,对自身方法进行调用
间接递归: 我调用你,你调用我
递归思想: 以此类推,和循环是一样的,都是以此类推的意思
递归和迭代是等价,都需要 起始值,终止条件,步长,否则就会出现死循环
循环能实现的递归一定能实现,递归能实现的循环不一定能实现
3.2常见异常
栈内存溢出
3.3 斐波那契数列
递归实现:
循环实现: