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