_05_方法声明和使用,重载及递归,内存分析

内容介绍:
什么是方法呢?
变量目的 : 内存空间的重用
方法/函数的目的 : 为了代码重用
相同类型的操作,不用重复写相同的代码
什么是方法 : 就是一段有名字的代码段,一个大括号就是一个代码段
在这里插入图片描述

没有使用方法之前,相同的代码,如果想执行多次,就需要写多遍

方法的声明 : 语法结构
[修饰符列表] 方法返回值类型 方法名 (参数列表) {
Java语句;
}
加[] : 说明 可以有,可以没有,可以有多个

1 方法修饰符列表 :
权限控制的 : public ,private ,protected
static,abstract,synchronized,final

2 返回值类型 : 11种数据类型中的任意一种
3 没有返回值 : void
4 方法名 : 合法标识符即可
5 方法形参列表 : 可以没有,可以有多个,多个之间用逗号隔开 , 但是 () 必须有,
形参 : 是指在函数/方法定义处,哪些参数(数据类型 变量 , 数据类型 变量,…)
实参 : 在方法调用处,传入的具体数据

6 方法体 : 如果有返回值类型,方法体中,最后一句,必须有return语句,而且return后面 必须加上一个和返回值类型对应的值 , 并且return 有终止函数运行的作用
如果没有返回值,方法体中就可以没有return,但是如果写上return之后,这个return后面不能跟任何数据,并且这个return只能起到终止函数运行的作用

程序语句之下的顺序
从上往下,从左到右
在面向对象,和方法中,就是方法的调用,由于方法的出现,就可以任意的顺序写代码
,但是在方法内部,依然是从上往下从左到右执行

方法不调用不执行,调用才执行,并把结果返回到调用出

方法定义的时候,也就是写代码的地方,是不执行的,执行是在调用的地方,并且把运行的结果返回到调用的地方

特殊的方法 : main()
所有的方法调用的起点,都是main方法,这个是程序的入口,函数执行完成后的返回值,也是返回到main
Main方法是jvm调用的

Return 有结束函数运行的作用,

方法分类 :
静态方法 : 用static修饰的是静态方法
成员方法 : 没有用static修饰的是成员方法
构造方法 : 默认是 公共的静态的,没有返回值的,方法名和类名相同,用于创建实例化对象,如果一个类中,没有创建构造方法,就会默认有一个无参构造,如果显试声明一个构造方法,默认构造将会不起作用

方法调用 :
静态方法 : 类名.静态方法名(参数);
当前类中,类名可以省略
但是在编译的时候,会自动加上当前类的类名
成员方法 : 对象引用.成员方法名(参数);

回调函数 : 如果方法的参数,是一个方法的调用,就是回调函数
本质,就是返回值
参数的类型和 调用方法的返回值类型一致才行

唯一性 :
如何唯一性的标识一个方法
怎么区分两个方法是不同的方法
1 方法名,如果方法名一样呢?
2 参数列表不同
个数不同
类型不同

方法重载 :
方法名相同,参数列表不同就叫方法的重载
和返回值 修饰符 都没有关系,只看方法名和参数列表

同一个功能,同一个方法,方便调用

在这里插入图片描述

程序 : 命令的集合,就是一堆代码(命令)
可执行文件就是程序,但是是一个静态的概念,一般保存在硬盘中
进程 : 就是正在执行的文件,是个动态概念,会按照程序的设计,一步步的执行

运行起来的程序,就是指载入到内存的可执行文件,这个时候操作系统会开启一个进程来运行这个内存中的文件对象,如果要关闭某个程序,可以直接杀死对应的进程

Java中的内存划分和管理
Java Runtime Data Area : java 运行时数据区域,我们也可以叫做JVM

内存被划分为 5个区域
程序计数器
静态区/方法区
而方法区中,又被分为 静态代码段和静态数据区
栈内存(VM栈)
堆内存
本地方法栈

程序计数器 :
可以看做是当前线程执行的字节码的位置指示器,分支,循环,跳转等,都需要依赖这个计算器来完成
可以理解为保存的是main方法所在的行号

静态区/方法区 :
静态代码段
用来存放我们程序文件,载入到内存之后的文件的对象
运行起来的class文件被保存在静态代码段中
静态数据区
保存运行时常量池

栈内存 :
虚拟机栈,也叫栈内存
方法是放到栈内存中执行的,包括局部变量

栈内存 : 是一个以栈数据结构为模型的一段内存空间
栈 : 是一种数据结构,先进后出,类似于弹夹

栈的构成因素 :
栈空间 : 就是指以栈数据结构为模型开辟的一段内存空间
栈帧 : 栈内存中,每一个栈元素叫栈帧
栈底元素 : 是最先放进去的那个元素
栈顶元素 : 是最后放进去的那个元素

栈的操作 :
压栈 : 就是指把元素放入到栈空间的过程
弹栈 : 就是把元素从栈空间中弹出去的过程

堆内存 :
是指用来存放,根据静态代码段中class文件对象,创建的用来保存class定义的数据的对象 的空间
保存java对象的

每个对象空间分为三大块 :
数据部分 : 成员变量
头部 : hashCode值
类型 : 是哪个类实例化而来的,保存类文件在静态区的地址
所以,对象可以调用静态变量

本地方法栈 :
用来执行本地方法,当我们调用本地方法的时候,对于我们来说,就和调用java方法一样,但是对于JVM来说,还是有些区别的
所以,需要有一个专门的区域来存放
虚拟机栈是给JVM提供执行java方法服务的,而本地方法栈是为JVM提供使用native方法的服务的

程序的执行 : 就是方法的调用,方法的调用过程对应在内存中的变化
方法的调用 : 就是压栈
方法执行结束 : 就是弹栈
所以,栈就是程序真正运行的地方,而静态代码段,堆内存,静态数据区都是用来保存代码和数据的地方

Java流程
1 编码
2 java程序编译
Javac 源文件名 (xxx.java --> xxx.class)
3 java 程序调用 :
Java 程序名
1 开启java虚拟机,然后把程序名对应的class文件,载入到静态代码段中
2 JVM自动调用程序中的main方法,
3 main方法一调用,就会在栈内存中开辟一个栈帧,然后把main方法中的代码复制过去,然后开始执行
4 在main方法中,如果没有别的调用,就直接执行,运算,然后弹栈,程序结束
5 如果在main方法中,调用了别的方法,会再次来栈内存中,开辟一个栈帧,把被调用方法的代码复制进去,
6 等被调用方法执行完之后,如果有返回值,就把数据放到临时空间中,然后弹栈,返回到main方法中的调用处,并把临时空间的数据也传递回去
7 如果被调用方法中,还有方法调用,那就继续压栈,一直到被调用方法执行完,或者是碰到return的时候,就开始返回
8 一直到返回到main方法,把main方法执行完,main方法栈帧弹栈,程序销毁

方法调用:就是压栈
方法执行结束 : 就是弹栈

递归 :
在一个方法的内部对自身方法进行调用,就叫递归
但是必须有 初始值,终止条件,步长
在这里插入图片描述
在这里插入图片描述

以上程序没有终止条件,所以会导致栈内存溢出,一直压栈,没有弹栈

递归本质就是一个循环

常见问题 :
累加加和
阶乘
斐波那契数列

在这里插入图片描述在这里插入图片描述

发布了24 篇原创文章 · 获赞 0 · 访问量 410

猜你喜欢

转载自blog.csdn.net/qq1317121361/article/details/102859170