标签:06 int void public static return 方法 day
一、方法
(1)、概述和作用
一堆代码的集合,可以重复使用
- 使程序变的更简洁更清晰
- 有利于程序维护
- 提高开发效率
- 提高代码重用性/复用性
(2)、方法声明
方法声明 : [修饰符列表] 返回值类型 方法名 (参数列表) { 方法体 }
[ ]:可以有,可以没有,可以有多个
1 方法修饰符列表,是可选的 :
权限控制 四选一 public,private,protected,默认(不写)
static(声明静态) , abstract , synchronized , fina
2 返回值类型 : 11种数据类型的任意一种,或者是 没有返回值 void
3 方法名 : 方法名字,合法的标识符即可(大小写字母,下划线,美元符号,数字,数字不能开头,不能使用关键字和保留字)
4 参数列表 : 可以有,可以没有,可以有多个,多个之间使用逗号隔开
形参 : 形容参数,在方法声明的时候,规定应该传入什么类型的数据
实参 : 实际参数,调用方法的时候,实际传入的数据
5 方法体 : 要做的事,代码集合
5.1 如果有返回值类型,那么方法体 中,最后一条语句,必须要写 return 数据;
比如 返回值类型为 int , 则 需要在方法体中写 return int值;,另外 return 还有终止方法运行的作用
5.2 如果没有返回值类型,那么方法体中,可以没有return语句, 如果要加return语句也行,那么return语句之后 不能有数据return;
此时 return只有终止方法运行的作用
public class Method_02 {
public static void main(String[] args) {
}
// 有返回值
public static int sumInt(int a , int b){
return a+b;
}
// 没有返回值
public static void sumInt1 (int a , int b){
System.out.println(a+b);
}
}
(3)、方法分类
分类 :
静态方法 : 类体中 使用static修饰的方法,是静态方法,类相关
成员方法 : 类体中 没有使用static修饰的方法,是成员方法,对象相关
构造方法 : 用于创建对象
public class Method_03 {
public static void main(String[] args) {
}
// 静态方法
public static void m1(){
}
// 成员方法
public void m2(){
}
// 构造方法,没有返回值类型,void都没有,方法名和类名一致
public Method_02(){
}
}
(4)、方法调用
调用 :
方法不调用不执行,调用才执行,并把结果返回到调用处,所以 方法声明时,不需要考虑声明的先后顺序,因为执行顺序是看调用的顺序的,而不是声明的顺序,因为声明的时候不执行
1 静态方法 : 类名.静态方法(参数值); 当前类中 类名可以省略
2 成员方法 : 对象.成员方法(参数值)
3 构造方法 : new
方法的声明,只管功能的实现,保证可以使用,至于这个方法会被谁调用,用来干什么,和声明无关
public class Method_04 {
public static void main(String[] args) {
sumInt1(1,22);
Method_02.sumInt1(1,22);
// 接收返回值,变量类型必须和返回值类型一致,如果没有返回值,是不能接收的
int result = sumInt(1,1);
System.out.println(result);
}
// 有返回值
public static int sumInt(int a , int b){
return a+b;
}
// 没有返回值
public static void sumInt1 (int a , int b){
System.out.println(a+b);
}
}
(5)、返回值
return : 有终止方法运行的功能,并且还可以返回数据
①、有返回值
方法有返回值的时候,必须有return
public class Method_04_ 2 {
public static void main(String[] args) {
}
public static int m1(){
return 0;
// return 之后 不能有代码,因为return就终止方法运行了,下面代码执行不到
}
public static int m2(){
// 这样是不行的,编译时检查语法结构,而if单分支有不执行情况,所以必须在if外在加一个return
// 或者再else中 也添加return
// 尽管 我们知道 一定会执行if中的return,外面也要加,因为编译器不知道
if (true) {
return 2;
}
}
}
②、没有返回值
没有返回值,可以没有return
public class Method_04_ 2{
public static void main(String[] args) {
m1(6);
}
public static void m1(int i){
// 参数列表中的变量,也是局部变量,调用处的实参的值,会赋值给该变量
for ( ; i <=10 ; i++) {
if (i == 5) {
// 如果没有返回值,单独写return意义不大(没有任何用),但是可以结合流程控制来发挥return的作用
return;
}
System.out.println(i);
}
System.out.println("Hello 执行完成");
}
public static void m2(){
// 因为没有返回值类型,所以 return 可以不加,如果要写,只能终止方法运行
// 并且 return 语句之后,不能跟数据, return;
return ;
}
}
(6)、方法重载
方法唯一性 : 方法名 和 参数列表
方法重载 : overload
方法名相同,参数列表不同(个数不同或类型不同)
在同一个类中,方法名是允许相同的,可以根据不同的参数列表找到某一个方法,叫方法重载
方法重载的优点,相同功能,只需要记住一个名字,通过参数区分不同的方法即可
public class Method_06 {
public static void main(String[] args) {
// 相同功能,方法名不同,不容易记忆,也不太好看
sumDouble(1, 2.2);
sumInt(2, 2);
sumLong(2323, 222);
// 功能相同,名字相同,根据参数列表区分,容易记忆,代码美观
sum(2,3);
sum(2,3.4);
sum(2L,3);
}
public static void sumInt(int a, int b) {
System.out.println(a + b);
}
public static void sumDouble(double a, double b) {
System.out.println(a + b);
}
public static void sumLong(long a, long b) {
System.out.println(a + b);
}
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);
}
}
二、内存分析
程序 : 一堆命令的集合,是可执行文件,并且是一个静态概念,一般保存在硬盘中
进程 : 就是正在执行的程序,是个动态概念,会按照程序设计,一步步在内存中执行
运行起来的程序,就是指载入到内存的可执行文件,这个时候,操作系统会开启一个进程来运行内存中的这个文件对象
如果要关闭某个程序,可以直接结束该进程
java中的内存划分
Java Runtime Data Area : java运行时数据区,也可以叫JVM内存
内存被划分为5个区域 : 程序计数器,方法区/静态区,栈内存,堆内存,本地方法栈
程序计数器 : 是一块比较小的内存区域,可以看做是当前执行的字节码位置, 分支 , 循环 , 跳转,异常等都需要依赖于程序计数器。可以理解为保存执行的代码行号,每个方法都会有一个计数器,要么你怎么知道返回值要返回到哪里去
方法区/静态区 :
保存我们的程序文件(class) , 载入内存后的哪个文件,java中就是class文件
包括方法执行之前,还有代码段,内部的运行常量池
栈内存
虚拟机栈/VM栈/栈内存
方法是在栈内存中执行的,包括局部变量也是在栈内存
栈内存 : 就是一个以栈数据结构为模型的一段内存空间
栈 : 是一个数据结构,先进后出 , 比如 弹夹
栈的构成因素
栈空间 : 就是指以栈数据结构为模型的一段内存空间(弹夹)
栈帧 : 栈内存中的每一个栈元素,叫栈帧(子弹)
栈底元素 : 是指第一个放入栈空间的栈帧(第一个放入弹夹的子弹,在最下面)
栈顶元素 : 是指最后一个放入栈空间的栈帧(最后一个放入弹夹的子弹,在最上面)
栈操作 :
压栈 : 就是指把栈帧放入栈空间的过程(把子弹放到弹夹的过程)
弹栈 : 就是指把栈帧在栈空间内移出的过程(把子弹从弹夹中打出去的过程)
堆内存 :
用来存放 根据静态区中的class文件对象,创建的用来保存class定义的数据的对象的空间
用来保存对象(类创建的对象 new)
每个对象的空间 分为3块
1 数据部分 : 成员变量
2 头部 : hashCode值
3 类型 : 是哪个类实例化而来的,保存类文件在静态区的地址
本地栈 :
比如hashCode()方法,前面有个 native(本地)声明, 当我们调用本地方法的时候,对于我们来说,和调用其他方法一样
但是对于JVM来说,还是有区别的,因为需要一个专门的区域来存放,native是C中的关键字
本地方法栈 和 VM栈 结构一样
VM栈用来执行我们的java方法服务的, 而本地方法栈是为了JVM使用native方法服务的
java执行流程 :
1 编码
文本编辑器,按照java规则,进行编码,创建.java文件
2 编译
通过javac命令,使用java编译器,对.java文件进行编译,生成.class文件
3 运行
通过java命令,运行.class程序
3.1 开启java虚拟机,把对应的.class文件载入内存中(静态区)
3.2 JVM自动调用该class中的main方法
3.3 main方法执行,JVM会在栈内存中开辟main方法栈帧(只要是方法调用,都会在栈内存开辟栈帧执行方法),然后把main方法中的代码复制进去,准备执行
3.4 如果main方法中 没有其他方法的调用,则安心执行main方法,执行完就终止,JVM就关闭
3.5 如果main方法中,有其他方法的调用,如果是其他类,则需要把对应的类的class文件,也载入到静态区
3.6 如果main方法中,调用的当前类的方法,则不需要重载载入当前类
3.7 当main方法中调用其他方法的时候,会再去栈内存中开辟对应的方法栈帧,把对应方法的代码复制进去,准备执行
当该方法执行完成之后,方法弹栈,并返回到main方法中的调用处,继续向下执行,一直到main方法执行结束,弹栈,JVM关闭
程序的加载
1 静态加载 : 程序开始执行,一次性把所有相关的文件,全部载入内存
2 动态加载 : 程序开始执行,先载入当前文件,当用到其他文件的时候,再单独去加载
java 中采用的动态加载
方法调用 就是压栈操作 , 而 方法调用结束,则是弹栈操作
public class text_01 {
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执行了");
}
}
标签:06,int,void,public,static,return,方法,day 来源: https://blog.csdn.net/xiaoppt/article/details/116903498
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。