目录
1. 方法
1.1方法重载
方法重载: 方法名相同,参数列表不同.
参数列表不同分为两种: 1 类型不同 2 个数不同
相同功能,相同名字,通过不同的参数区分,比较美观,容易记忆,相同的功能只需要记住一个方法即可
public class Chongzai {
public static void main(String[] args) {
isEquals((byte)1,(byte)2);//定义初始值类型大小;并且调用方法
isEquals((short) 1,(short) 2);
isEquals(1,2);
isEquals(1,2L);
boolean n= isEquals((byte)1,(byte)2);//定义返回值
boolean n1= isEquals((short) 1,(short) 2);
boolean n2= isEquals((short) 1,(short) 2);
boolean n3= isEquals((short) 1,(short) 2);
System.out.println(n);//输出
System.out.println(n1);//输出
System.out.println(n2);//输出
System.out.println(n3);//输出
}
public static boolean isEquals(byte a, byte b){
return a==b;
}
public static boolean isEquals( short a, short b){
return a==b;
}
public static boolean isEquals(int a, int b){
return a==b;
}
public static boolean isEquals( long a,long b){
return a==b;
}
}
1.2内存划分
程序: 可执行的文件,是一堆命令的集合,是个静态概念,保存在硬盘中
进程: 就是正在执行的程序,是个动态概念,保存在运行内存中,会按照该程序的设计在内存中进一步把执行
运行中的程序 也就是指载入到内存中的可执行文件,操作系统会开启一个进程,用来保存运行的这个文件
如果想要关闭某个程序只需要在内存中把该进程杀死即可
java的内存划分和管理
Java Runtime Data Area : java运行时数据区域,一般叫JVM内存
分为五大块 :
1 静态区/方法区 2 VM栈 3 堆内存 4 程序计数器 5 本地方法栈
程序计数器 : 是一块比较小的内存,字节码位置的指示器,比如当前执行到第几行了之类,分支,循环,跳转等
静态区 : 用来保存我们的程序文件(class),载入到内存之后的class文件保存在静态区中,还有一些静态资源 另外 方法被调用之前 也保存在静态区 , 还有常量池
VM栈 : 又叫栈内存 , 用来执行方法
是以栈数据结构为模型创建的一段空间 : 先进后出,类似于弹夹
栈空间 : 就是栈内存,就是以栈数据结构为模型创建的内存空间,叫栈空间 栈帧 : 栈空间中的元素,就是栈帧,比如 弹夹是栈空间的话,子弹就是栈帧
栈底元素 : 第一个放进去的栈帧
栈顶元素 : 最后一个放进去的栈帧
栈操作 :
压栈 : 就是指向栈空间中添加栈帧的过程,就是把子弹放到弹夹中,叫压栈
弹栈 : 就是指把栈帧在栈空间中弹出的过程
本地方法栈 : 用来执行本地方法,和栈内存一样, 使用 native 修饰的方法, 和我们没关系
堆内存 : 用来保存对象
执行流程 :
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中采用的是动态加载
2.递归
2.1概述
递归 :在方法体中,调用当前方法(自己调用自己)
递归的基本思想: 递归和迭代是等价的(迭代就是循环)以此类推 是基本思想
三要素: 初始值, 终止条件, 步长
2.2 应用场景
应用场景
一般树状结构的都可以使用递归操作(比如查询地区,文件目录等等)
递归算法比普通算法更消耗内存,谨慎使用,能完成循环的就不要用递归完成,除了某些特定情况只能用递归完成
递归场景面试题
1.文件夹复制
2.斐波那契数列
2.3常见异常
栈内存溢出,就是装满了
1. 程序有问题,导致死循环
2. 程序没有问题,就是装不下了
2.4 案例
/**
* 需求: 计算1~N的累加加和,并把结果返回
* @author 人间失格
*
*/
public class DiGui_01 {
public static void main(String[] args) {
int result=sum(5);//调用sum方法,并且给予参数
System.out.println(result);//打印输出加和结果
}
public static int sum(int n){//定义sum方法,公共的 静态 int型
int sum=0;//初始值为0
for(int i=1;i<=n;i++){//for循环
sum+=i;//加和
}
return sum;//结束返回sum,
}
}
/**
* 需求: 计算1~N的偶数和并返回
* @author 人间失格
*
*/
public class DiGui {
public static void main(String[] args) {
int n1=sum(4);//调用sum方法,并命名为n1,定义参数列表
System.out.println(n1);//打印返回值
}
public static int sum(int n ){//定义sum方法
if(n%2==1){//判断是否为偶数
n--;//如果是偶数n-1
}
if(n==2){//如果结果是2
return 2;//输出2
}
return n+sum(n-2);
}
}
斐波那契数列
/**
* 斐波那契数列
* 除了前两位是1,后面每一位都等于前两位的和
* 输入位数,得到相对于的位数的值
* @author 人间失格
*
*/
public class Fbnqsl {
public static void main(String[] args) {
int n1=fbnqs(20);
System.out.println(n1);
}
public static int fbnqs(int n){
if(n==1|n==2){
return 1;
}else {
return fbnqs(n-1)+(n-2);
}
}
}