1、方法重载
方法重载 : 方法名相同,参数列表不同
参数列表不同分为两种 : 1 类型不同 2 个数不同
目的:相同功能,相同名字,通过不同的参数区分, 比较美观,
容易记忆,相同功能只需要记住一个方法即可
类型不同:
个数不同:
2、内存划分
程序 : 可执行文件,是一堆命令的集合,是个静态概念 保存在硬盘中
进程 : 就是正在执行的程序,是个动态概念,保存在运行内存中,会按照该程序的设计在内存 中一步步执行;运行中的程序也就是指载入到内存中的可执行文件,操作系统会开 启一个进程,用来保存运行的这个文件如果想要关闭某个程序只需要在内存中把该 进程杀死即可。
java的内存划分和管理
Java Runtime Data Area : java运行时数据区域,一般叫JVM内存
分为五大块 :
1 静态区/方法区 2 VM栈 3 堆内存 4 程序计数器 5 本地方法栈
程序计数器 : 是一块比较小的内存,字节码位置的指示器,比如当前执行到第几 行了之类,分支,循环,跳转等
静态区 : 用来保存我们的程序文件(class),载入到内存之后的class文件保存在静态 区中,还有一些静态资源
另外 方法被调用之前 也保存在静态区 , 还有常量池
VM栈 : 又叫栈内存 , 用来执行方法
是以栈数据结构为模型创建的一段空间 : 先进后出,类似于弹夹
栈空间 : 就是栈内存,就是以栈数据结构为模型创建的内存空间,叫栈空间
栈帧 : 栈空间中的元素,就是栈帧,比如 弹夹是栈空间的话,子弹就是栈帧
栈底元素 : 第一个放进去的栈帧
栈顶元素 : 最后一个放进去的栈帧
栈操作 :
压栈 : 就是指向栈空间中添加栈帧的过程,就是把子弹放到弹夹中,叫压栈
弹栈 : 就是指把栈帧在栈空间中弹出的过程
本地方法栈 : 用来执行本地方法,和栈内存一样, 使用 native 修饰的方法, 和我们没关 系
堆内存 : 用来保存对象
java文件执行流程 :
1 javac编译 生成class文件
2 java命令 运行
2.1 开启java虚拟机,然后把对应的文件 Method_02.class 载入内存中的静态 区
2.2 载入之后,JVM自动调用该程序中main方法 ,然后再栈内存开辟main方法 栈帧,开始执行
2.3 如果main方法中没有其他方法调用,则执行完结束,销毁即可
2.4 如果main方法中有其他方法调用, 如果是其他类中的方法,则把对应类也 会加载到静态区,然后调用该方法
2.5 如果是当前类的 方法,直接在栈内存继续压栈即可
2.6 如果被调用方法中还有其他方法调用的话,则步骤同上
2.7 一直到最后一个压栈的方法执行完,弹栈,然后再依次返回调用处继续执行
2.8 一直到main方法执行完,弹栈,程序销毁
方法的调用,就等于是压栈操作而方法调用结束,就等于是弹栈操作
静态加载 : 程序开始执行,首先把所有和程序相关的类全部一次性载入
动态加载 : 开始执行的时候,只加载必须的类,在执行的过程中,需要用到其他 类,再去加载
java中采用的是动态加载
- 递归(recursion)
递归 : 在方法体中,调用当前方法(自己调用自己)
递归的基本思想 : 递归和迭代是等价的 (迭代就是循环) 以此类推 是基本思想
循环三要素 : 初始值,终止条件,步长
递归应用场景:一般树状结构的都可以使用递归操作,比如查询地区,树状菜单,文件目录等
递归的算法比普通算法更耗内存,谨慎使用,能用循环完成,就不用递归完成,除 非某些树状情况只能使用递归搞定
递归场景面试题 :
1 文件夹复制
2 斐波那契数列 1 1 2 3 5 8 13 21 34 55
递归求斐波那契数列:
循环求斐波那契数列:
递归常见异常:
出现原因:自己一直调用自己,没有终止条件,导致栈用完溢出。