方法是什么,方法有什么用?
是可以完成某个特定功能的并且可以充分利用的代码片段。(提高复用)
局部变量有一个特点:方法结束之后,局部变量占用的内存会自动释放。
方法怎么定义,语法机制是什么?
[修饰符列表] 返回值类型 方法名(形式参数列表){
方法体;
}
修饰符列表是可选的
返回值类型:可以是任何类型,基本数据类型和引用数据类型。如果方法不返回任何值,是用void; 使用return 值;
方法内只要有“return”关键字的语句执行,当前方法必然结束。
如果返回值类型是void,那么在方法体当中不能有“return 值;”这样的语句。但是可以有“return;”语句。
这个语句“return;”的作用就是用来终止当前方法的。
方法名:
方法名要见名知意。(驼峰命名方式)
方法名在标识符命名规范当中,要求首字母小写,后面每个单词首字母大写。
只要是合法的标识符就行。
形式参数列表:
形式参数列表中的每一个参数都是“局部变量”,方法结束后就内存释放
形参的个数不限制,用逗号间隔
方法调用
怎么调用,语法是什么?
类名.方法名(实际参数列表);
实参和形参的类型必须一一对应,另外个数也要一一对应。
如果有返回值,可以不接收;如果没有返回值,无法接收
类名. 可以省略,a()方法调用b()方法的时候,a和b方法都在同一个类中,“类名.”可以省略。如果不在同一个类
中“类名.”不能省略。
任何一个方法体当中的代码都是遵循自上而下的顺序依次逐行执行的。
main方法最先执行,并且main方法是最后一个结束。
main结束,整个程序就结束了。
break;用来终止switch和离它最近的循环。
return;用来终止离它最近的一个方法。
方法执行的内存变化
JVM的主要内存结构
栈内存(方法被调用的时候,方法需要的内存空间在栈中分配) 堆区 方法区
栈:先进后出, 进栈(push), 出栈(pop), 栈顶元素,栈底元素,栈帧:指向栈顶元素,栈顶元素具有活跃权
方法执行
方法不调用是不会在栈中分配空间的。
方法只有在调用的时候才会在栈中分配空间,并且调用时就是压栈。
方法执行结束之后,该方法所需要的空间就会释放,此时发生弹栈动作。
方法调用叫做:压栈。分配空间
方法结束叫做:弹栈。释放空间
栈中存储什么?方法运行过程中需要的内存,以及栈中会存储方法的局部变量。
堆区:凡是通过new 创建的对象,都会存储在堆内存当中
方法区: 存储代码片段,方法区是最先加载的, .class 代码字节码
方法重载
重载定义:方法名字相同,形参列表不同,返回值也可以不同。程序调用的时候根据形参来自动判断调用哪一个
什么时候代码会发生方法重载?
条件1:在同一个类当中
条件2:方法名相同
条件3:参数列表不同
参数的个数不同算不同
参数的类型不同算不同
参数的顺序不同算不同
只要同时满足以上3个条件,那么我们可以认定方法和方法之间发生了重载机制
方法重载和方法的“返回值类型”无关。方法重载和方法的“修饰符列表”无关。方法名+ 形参列表
方法递归
1、什么是方法递归?
方法自己调用自己,这就是方法递归。
2、当递归时程序没有结束条件,一定会发生:
栈内存溢出错误:StackOverflowError
所以:递归必须要有结束条件。(这是一个非常重要的知识点。)
JVM发生错误之后只有一个结果,就是退出JVM。
3、递归假设是有结束条件的,就一定不会发生栈内存溢出错误吗?
假设这个结束条件是对的,是合法的,递归有的时候也会出现栈内存溢出错误。
因为有可能递归的太深,栈内存不够了。因为一直在压栈。
4、在实际的开发中,假设有一天你真正的遇到了:StackOverflowError
首先第一步:
先检查递归的结束条件对不对。如果递归结束条件不对,必须对条件进一步修改,直到正确为止。
第二步:假设递归条件没问题,怎么办?
这个时候需要手动的调整JVM的栈内存初始化大小。可以将栈内存的空间调大点。(可以调整大一些。)
第三步:调整了大小,如果运行时还是出现这个错误,没办法,只能继续扩大栈的内存大小。
ps. 运行Java程序,是看.class 文件在哪里,和 java文件没关系,class 文件如果在一个文件夹下,可以跨类调用方法