1.方法
方法是可以完成某个特定功能的并且可以被重复利用的代码片段。在C语言中,方法被称为“函数”。在java中,叫做方法。
2.方法的语法机制
[修饰符列表] 返回值类型 方法名(形式参数列表){
方法体;
}
注:以上中括号[]里面的内容表示不是必须的,是可选的。
3.形式参数列表
形式参数列表中的每一个参数都是局部变量,方法结束之后内存释放。形参的个数是:0~N个。
形参的数据类型起决定性作用,形参对应的变量名是随意的。
4.方法体
方法体当中编写的是业务逻辑代码,完成某个特定功能。在方法体中的代码遵循自上而下的顺序依次执行。在方法体中处理业务逻辑代码的时候需要数据,数据来源就是形参。
5.方法的调用
类名.方法名(实参);
注意:a()方法调用b()方法的时候,a和b方法都在同一个类中,那么“类名.”可以省略。如果不在同一个类中,“类名.”不能省略。
6.使用方法时注意:
1)程序开始执行的时候是先执行main方法(入口)。main方法不需要程序员手动调用,是由JVM调用的。
2)方法是定义在类体中的,方法定义的先后顺序没有要求,可以定义在main方法前,也可以定义在main方法后。
3)方法名要见名知意。方法名在标识符命名规范当中,要求首字母小写,后面每个单词首字母大写。
4)当一个方法有返回值的时候,可以选择不接收,这是允许的。
7.JVM内存结构
JVM中主要的三块内存空间:栈、堆、方法区。
方法区: 类加载器classloader将硬盘上的xxx.class字节码文件装载到JVM的时候,会将字节码文件存放到方法区当中。也就是说方法区中存储的是代码片段。 方法区中最先有数据。
栈: 在方法被调用的时候,该方法需要的内存空间在栈中分配。方法不调用是不会在栈中分配空间的。方法只有在调用的时候才会在栈中分配空间,并且调用的时候就是压栈;方法执行结束之后,该方法所需要的空间就会释放,此时发生弹栈动作。
8.方法重载
1)java编译器首先会通过方法名进行方法的区分。但是在java语言中允许方法名相同的情况出现,如果方法名相同,编译器会通过方法的参数类型进行方法的区分。
2)方法重载的优点
- 代码整齐美观;
- 功能相似的,可以让方法名相同,更易于以后代码的编写。
3)方法重载的条件
- 在同一个类中;
- 方法名相同;
- 参数列表不同(个数/类型/顺序)。
只要同时满足以上三个条件,那么我们可以认定方法和方法之间发生了重载机制。
注意:方法重载与方法的返回值类型、方法的修饰符列表无关。
9.方法递归
1)什么是方法递归?
方法自己调用自己,这就是方法递归。
2)当递归时程序没有结束条件,一定会发生栈内存溢出错误(StackOverFlowError),所以递归必须要有结束条件。
3)即使在方法递归时,方法中有结束条件且结束条件是对的,也有可能发生栈内存溢出错误,这是因为可能递归的太深了,栈内存不够了。
4)在实际的开发中,不建议轻易的选择递归,能用for循环或者while循环代替的尽量使用循环,因为相对来说循环的效率更高,耗费的内存少;递归耗费的内存比较大。另外递归的使用不当,会导致JVM死掉。
5)解决StackOverFlowError问题:
首先:先检查递归结束的条件对不对,如果递归结束条件不对,必须对条件进一步修改,直到正确为止。
第二步:若递归条件没问题,需要手动调整JVM的栈内存初始化大小,将栈内存空间调大点。
第三步:调整了大小,如果运行的时候还是出现了这个错误,那只能继续扩大栈的内存大小。