欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

day_06 _方法、重载、内存划分

程序员文章站 2024-03-26 08:21:35
...

一. 方法

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、程序的加载

静态加载:程序开始执行时,一次性的把所有相关的文件全部载入到内存中。
动态加载:程序开始执行时,先载入当前文件,需要用到其他文件时,再去单独加载。

方法调用:压栈操作 方法调用结束: 弹栈操作