day_4

目录

1.方法

1.1  作用 

1.2 方法声明

1.2.1修饰符列表:可以有,可以没有,可以有多个,有些不能重复出现,多个修饰符没有先后顺序.

1.2.2返回值类型:执行完之后是否要将结果反馈给调用处,可以写11种数据类型中任意一种,如果不需要返回值则写void(要返回的数据是什么类型,这里就写什么类型,没有则写void)

1.2.3 方法名:符合命名规则即可

1.2.4 参数列表:可以有多个也可以没有

1.3 方法分类

1.4 方法调用

1.5 入参出参练习

1.6  方法重载

2.内存分析

2.1  静态区/方法区 : 保存静态资源文件,比如静态变量,方法,运行时的class文件等

2.2  VM栈 : 以栈数据结构为模型,创建的一块空间,主要用于执行方法

2.3  堆内存 : 保存类对象和成员变量及成员方法

3.递归

3.1  概念和应用

3.2  斐波那契数列


1.方法

1.1  作用 

可以将代码弄到一个集合里面,创建新空间储存,并设置名字,方便找到

目的 :代码复用,容易修改,方便使用,易维护,易拓展,灵活度提高.

1.2 方法声明

修饰符列表  返回值类型  方法名(参数列表){方法体}

形参 : 声明方法时,参数列表的定义.

实参 : 调用方法时,传入的实际数据.

1.2.1修饰符列表:可以有,可以没有,可以有多个,有些不能重复出现,多个修饰符没有先后顺序.

权限控制相关:piblic,private,protected,不写(默认包权限)四选一

static 表示静态,不加为成员.

synchronized ,final ,abstract...(但是final 和abstract 不能同时出现)

1.2.2返回值类型:执行完之后是否要将结果反馈给调用处,可以写11种数据类型中任意一种,如果不需要返回值则写void(要返回的数据是什么类型,这里就写什么类型,没有则写void)

如果指定了返回值,则方法体内必须有return 语句

1.2.3 方法名:符合命名规则即可

  命名规则 :

强制规则 : 只允许使用大小写字母,$,_,数字,且数字不能开头,不能使用关键字和保留字

关键字 : java中已经使用的单词,代表了特殊含义

保留字 :目前版本中还没有使用的词汇,但是后续版本可能会使用

非强制规则 : 建议望文知义,驼峰命名法

1.2.4 参数列表:可以有多个也可以没有

1.3 方法分类

静态方法:使用static 修饰的方法

成员方法:没有使用static 的方法

构造方法:构造方法 是每个类都有的,并且用于创建该类的对象

                  如果该类中没有编写构造方法,那么编译器会自动帮我们生成一个无参构造

                  构造方法语法:修饰符 方法名/类名(参数列表){方法体}

注 : 构造方法没有返回值  连void都没有

1.4 方法调用

  方法不调用不执行,调用才执行,并把结果返回给调用处

  前缀.方法名(参数)

静态方法:类名.方法名(参数),如果调用当前类中的静态方法,类名可以省略.

成员方法:对象.方法名(参数)

1.5 入参出参练习

入参:参数列表(xxx),一般让你做一件事的时候,你需要用到的必要的未知条件(未知数据)

出参:返回值,一般完成功能后,你的打印语句,一般是需要返回的数据.

(return 会终止方法运行,所以return 后不能写代码)

1.6  方法重载

  方法的唯一性:java中方法可以重名

    方法重载:方法名相同,参数列表不同(个数不同或者类型不同)

    目的:使用方便,相同功能,相同方法名,方便记忆

例如: 输出语句一直在用方法重载:

System.out.println(123);

System.out.println(false);

System.out.println("性能查看的");

三个println输出的是三个类型,省略了类型名,方便使用

2.内存分析

2.1  静态区/方法区 : 保存静态资源文件,比如静态变量,方法,运行时的class文件等

2.2  VM栈 : 以栈数据结构为模型,创建的一块空间,主要用于执行方法

 栈数据结构特征 : 先进后出

 栈顶元素 : 最后放进去的

 栈底元素 : 第一个放进去的

 栈帧 : 栈数据结构中的元素,称为栈帧

 压栈 : 把栈帧放到栈空间的过程

 弹栈 : 把栈帧在栈空间弹出去的过程

每当调用一个方法的时候,该方法就会在栈内存中开辟一个栈帧,并压栈到栈空间,开始执行,方法执行完后,弹栈,栈帧销毁

2.3  堆内存 : 保存类对象和成员变量及成员方法

2.3.1 编码 , 程序员通过java语言,编写java程序

2.3.2 编译 , 把java文件编译成class文件

2.3.3 运行 , 运行时 JVM开机,将所运行的类载入内存空间中的静态区

①加载完成后,JVM会自动调用该类的main方法(只要是方法调用,就会在栈内存中开辟栈帧并压栈)

② 如果main方法中,有别的方法调用

如果调用的是其他类中的方法,则先把对应类加载到静态区,然后再栈内存中开辟栈帧

如果调用的是当前类中的方法,则直接在栈内存开辟栈帧

2.3.4 如果被调用的方法中,还有其他方法调用,则继续开辟栈帧压栈,一直到栈顶元素,执行完成,弹栈,返回上一个栈帧继续执行

 2.3.5 直到main栈帧弹栈,则整个程序生命周期终止

3.递归

3.1  概念和应用

3.1.1递归和迭代(循环)是等价的

循环可以做的,递归也能做,但是递归能做的,循环不一定能做

递归需要频繁压栈弹栈,比较消耗内存,并且效率较低,所以循环能完成的,就不要使用递归

比如 树状结构,目录遍历等 都需要使用递归完成

递归 :

 直接递归 : 方法中调用当前方法(自己调用自己)

 间接递归 : 两个方法相互调用

// 直接递归

public static void m1(){

// 注意 递归 也有符合 循环三要素

// 初始值,终止条件,步长,否则会死循环

// Exception in thread "main" java.lang.StackOverflowError

// 因为一直压栈,不会弹栈,导致栈内存溢出

m1();

}

// 间接递归

public static void m2(){

m3();

}

public static void m3(){

m2();

}

3.2  斐波那契数列

斐波那契数列 :  前两位为1, 后面每位的值都等于前两位的和

例如: 1 1 2 3 5 8 13 21 34 55 89

public static void main(String[] args) {

//test()里输入第几位  输出递归计算的结果

int result = test(21);

System.out.println(result);

//test2()里输入第几位  输出for循环计算的结果

test2(21);

}

// 计算 第N位的值 是多少(递归方法实现)

public static int test(int n) {

if (n == 1 || n == 2) {

return 1;

}

return test(n - 1) + test(n - 2);

}

(解释: 以text(5)为例)

  text(5)之后执行text(4)再进行text(3)再到text(2)执行text(1)之后返回之text(4)下的text(2)

以此类推  完成整个递归

//计算 第N位的值 是多少(用for循环来实现)

public static void test2(int n){

// 默认表示第一位(还表示当前位的前两位)

long a = 1;

// 默认表示第二位(还表示当前位的前一位)

long b = 1;

long c = 1;// 表示当前位

if (n == 1 || n == 2) {

System.out.println(1);

return;

}

for (int i = 3; i <= n; i++) {

c = a+b;

a = b;

b = c;

}

System.out.println(c);

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值