day_06 _方法、重载、内存划分
一. 方法
1. 方法目的
可以使方法中的代码重复使用。
2.方法声明
[修饰符] 返回值类型 方法名(参数列表){方法体}
[ ]可以有多 可以没有 也可以有多个
1、方法修饰符列表,是可选的:
权限的控制(四选一):public private protected 默认(不写的那个)
static(声明静态) abstract synchronized , final
2、返回值类型:11中数据类型中的任意一种,或者是没有返回值时的void
3、方法名:方法名字,必须是合法的标识符(大小写字母,下划线,美元符号,数字,数字不能开头,不能使用关键字和保留字)。
4、参数列表:可以有,可以没有,也可有多个,之间用逗号隔开即可。
形参:形容参数,在声明方法的时候,规定应该传入什么类型的数据。
实参:实际参数,调用方法的时候,实际传入的数据。
5、方法体:要重复使用的代码的集合。
5.1 如果有返回值类型,那么末尾一定要加上return 数据;
5.2如果没有返回值类型,那么末尾就可以没有return,也可以加上,但是后面不能带上数据,只能表示终止方法的运行。
3.分类
静态方法: 类体中 使用static修饰的方法,是静态方法,类相关。
成员方法: 类体中 没有使用static修饰的方法,是成员方法,对象相关。
构造方法: 用于创建对象。
4.调用
方法是不调用就不执行的,只有调用之后才会执行,并把结果返回到调用处。(因此方法在声明的时候,不需要考虑先后顺序)
静态方法: 类名,静态方法(参数值);当前类中时,类名可以省略。
成员方法:对象,成员方法(参数值)。
构造方法:null
text();
public static void text(){
for(int i=1;i<=100;i++){
if(i%7==0){
System.out.println(i);
}
}
}
! 方法的声明: 只管功能的实现,保证其可以使用即可。
5.return
可以终止方法的运行,还可以返回数据。
(1) 如果方法有返回值的时候,必须有return。
public static int m2(){
// if单分支有不执行情况,所以必须在if外在加一个return
// 或者再else中 也添加return
// 尽管一定会执行if中的return,外面也要加,因为编译器不知道
if (true) {
return 2;
}else{
return 1;
}
}
(2) 没有返回值的时候,可以没有return.
// 没有返回值
public static void sum1(int a,int b){
System.out.println(a+b);
}
方法唯一性: 方法名和参数列表
二、重载 overload
1.定义
在同一个类中,方法名是允许相同的,这样就可以根据不同的参数找到不同的方法。
2. 方法重载的优点
相同的功能,只需记住一个名字,通过参数区分不同的方法。
// 功能相同,名字相同,根据参数列表区分,容易记忆.
sum(2,3);
sum(2,3.4);
sum(2L,3);
}
public static int sum(int a, int b) {
System.out.println(a + b);
return 1;
}
public static void sum(double a, double b) {
System.out.println(a + b);
}
public static void sum(long a, long b) {
System.out.println(a + b);
}
三、栈
1.程序
命令的集合,是可执行文件,是静态概念,保存在硬盘中。
2.进程
正在执行的程序,是动态概念,在内存中运行(按照程序的设计)。
运行起来的程序:载入到内存的可执行文件,这时,系统会开启一个进程来执行内存中的这个文件对象。
当需要关闭这个程序时,直接结束该进程即可。
3.java中内存的划分
Java Runtime Data Area : java运行时数据区,也可以叫JVM内存。
内存被划分为5个区域 : 程序计数器,方法区/静态区,栈内存,堆内存,本地方法栈。
4、程序计数器
4.1定义 一块比较小的内存区域,可以当做是当前执行的字节码位置,分支循环,跳转,异常等等都需要依赖程序计数器。
4.2解释 内存执行的代码行号,每一个方法都有一个计数器,
方法区/静态区:
保存程序文件(class),载入内存后的那个文件,在java中就是class文件。
5、栈内存
5.1定义
一个以栈数据结构为模型的一段内存空间。
5.2栈
一个数据结构,先进后出。(下面以弹夹为例)
6、栈的构成因素:
栈空间: 以栈数据结构为模型的一段内存空间(弹夹)
栈帧:栈内存中的每一个元素(子弹)
栈底元素:第一个放入到栈空间的栈帧(第一颗放入的子弹)
栈顶元素:最后一个放入到栈空间的栈帧(最后一个放入的子弹)
7、栈操作
压栈:把栈帧放入到占空间的过程。
弹栈:把栈帧从栈空间内移出的过程。
8、堆内存
内存中用来存储数据的一部分空间。
用来保存对象(类创建的对象 )
每一个对象的空间分为三块:
数据部分:成员变量
头部:hashCode值
类型:保存类文件在静态区的地址
9、本地栈
比如hashCode()方法,前面有个 native(本地)声明, 当我们调用本地方法的时候,对于我们来说,和调用其他方法一样。
但是对于JVM来说,还是有区别的,因为需要一个专门的区域来存放,native是C中的关键字 。
本地方法栈 和 VM栈 结构一样。
VM栈用来执行我们的java方法服务的, 而本地方法栈是为了JVM使用native方法服务的。
10、java的执行流程
(1)、编码 : 文本编辑器,按照java的规则创建java文件。
(2)、编译: 通过javac的命令,使用java编译器对java文件进行编译,生成.class文件。
(3)、运行: 通过java命令,运行.class程序。
(3.1) 开启虚拟机,把.class文件载入到内存中,
(3.2) JVN自动调用class中的main方法。
(3.3) main方法执行,JVM在栈内存中开辟main方法的栈帧。
(3.4) 如果main方法中没有调用其他方法,则按照顺序执行main方法即可。
(3.5) 如果main方法中调用了其他方法,如果是其他类,就需要把对应的class文件载入到静态区中。
(3.6) 如果main方法中调用的是当前类中的方法,则不需要重新载入当前类。
(3.7) 当main方法中调用其他方法的时候,会去栈内存中再开辟对应的方法栈帧,把对应的代码复制过去,准备执行。
(3.8)当调用的其他方法执行完毕之后,进行弹栈,然后按照main方法中的顺序继续向下执行,直到main方法执行完毕,弹栈,JVM关闭。
public class Method_06_A {
public static void main(String[] args) {
m1();
System.out.println("main执行了");
}
public static void m1(){
m2();
System.out.println("m1执行了");
}
public static void m2(){
m3();
System.out.println("m2执行了");
}
public static void m3(){
System.out.println("m3执行了");
}
}
11、程序的加载
静态加载:程序开始执行时,一次性的把所有相关的文件全部载入到内存中。
动态加载:程序开始执行时,先载入当前文件,需要用到其他文件时,再去单独加载。
方法调用:压栈操作 方法调用结束: 弹栈操作
推荐阅读