1.方法
1.1概述
方法:就是很多条语句的集合,把这些代码放到方法中,然后就可以多次使用这个方法
方法目的:代码复用,使程序变得更加简短清晰,提高开发的效率
1.2方法声明
声明:
修饰符列表 返回值类型 方法名 (参数列表){方法体}
修饰符列表:可以有,可以没有,可以多个
权限修饰符:public protect private 不写 四选一
其他修饰符:static,synchronized ,abstract,final二选一
返回值类型:11种数据类型中的一种,如果不需要返回值,则写void
方法名:方法的名字,望名知义,驼峰命名法
参数列表:要做一件事,需要的必备条件,可以作为入参
可以多个,用逗号隔开 比如: int a,int b ,int c…
形参:在方法声明的时候,定义的参数列表
实参:方法调用时,方法调用时实际传入的数据
方法体:
1.3方法分类
1.静态方法:使用static修饰的方法,是静态方法
2.成员方法:没有static修饰的方法是成员方法
3.构造方法:创建对象使用,先不管
调用:
静态方法:类名.静态方法名(参数),同类中 类名可以省略
成员方法:对象引用.成员方法名(参数)
方法不调用不执行,调用才执行,并把结果返回到调用处
public static void main(String []args){
int result = method_01.m1(123,5312);
System.out.println(result);
}
public static int m1(int a,intb){
return a + b;
}
public static void m2(){
return;
}
1.4入参和出参
public static void main(String[] args) {
// print_01();
// print_02(5);
int result = sum(12, 120);
System.out.println(result);
}
// 1 需求 : 向控制台打印1-10
public static void print_01() {
for (int i = 1; i < 11; i++) {
System.out.println(i);
}
}
// 2 需求 : 向控制台打印1-N的值
// 参数列表中的变量是局部变量
public static void print_02(int n) {
for (int i = 1; i <= n; i++) {
System.out.println(i);
}
}
// 3 需求 : 计算 n~m的累加加和,并返回
// ps : n和m均为整数,且 m > n
public static int sum(int n, int m) {
int sum = 0;
for (int i = n; i <= m; i++) {
sum += i;
}
return sum;
}
// 4 需求 : 给定三个整数 , 返回其中最大的一个数, ps 你可以假设 三个数不相等
public static int max(int a, int b, int c) {
if (a > b && a > c) {
return a;
} else if (b > a && b > c) {
return b;
} else {
return c;
}
}
1.5方法重载
方法唯一性:
方法名和参数
方法重载:overload方法名相同,参数列表不同
列表不同分为:个数不同和类型不同
2.内存分析
2.1内存划分
* Java Runtime Data Area : java运行时区域,一般叫JVM内存
*
- 程序计数器 :
-
一块较小的内存区域.作用可以看做是当前程序执行的位置指示器
- 静态区/方法区 :
-
保存程序文件(class文件) 以及静态数据,方法被调用之前,也保存在静态区,内部还有运行时常量池
- VM栈 : 又叫栈内存
-
栈内存是以栈数据结构为模型开辟的一段空间, 特性是先进后出
-
栈 : 是一种数据结构,先进后出,像弹夹
- 栈的构成因素
-
栈空间 : 栈内存就是栈空间
-
栈帧 : 栈空间中的每一个栈元素 就叫栈帧(比如 弹夹中的每一个子弹 就叫栈帧)
-
栈底元素 : 第一个放进去的栈帧
-
栈顶元素 : 最后一个放进去的栈帧
- 栈操作
-
压栈 : 就是指把元素放入栈空间的过程
-
弹栈 : 就是把元素弹出去的过程
- 栈内存,是用来执行方法的,所有方法的执行,必须在栈内存进行
- 本地方法栈 :
-
用来执行一些本地方法,比如hashCode 等 , 模型和操作都和VM栈一致 , 不用管,
- 堆内存 :
-
用来保存对象
2.2运行机制
1.java程序编写
2.java编译,得到class文件
3.java命令 运行
3.递归
3.1概述和基本使用
递归:方法中调用当前方法
递归思想
递归和迭代是等价的就是循环
基本思想就是以此类推
应用场景:
循环能做的,递归都能做,但是这种情况下,优先使用循环,因为递归非常消耗内存,运行效率低,但是像树状结构之类的,循环是没法做的只能通过递归来搞定
常见问题
所有树状结构
文件夹复制
斐波那切数列
难点:不容易理解,递归思想
画图。栈帧调用图
注意 必须终止条件,否则就等于死循环一样,导致一直压栈不会弹栈而出现的内存溢出问题
以下就是因为没有终止条件导致栈内存溢出
public static void main (String []args){
m1();
}
public static void m1(){
m1();
}
//1-N的累加加和
public static int sum(int n){
if(n==1){
return 1;
}
else{
return n+sum(n-1);
}
}
3.2斐波那契数列
public static void main(String[] args){
int result = factorial(20);
System.out.println(result);
public static int factorial(int n){
if(n==1 || n==2){
return 1;
}else{
return factorial(n-1) + factorial(n-2);
}
}



