一、方法 method
1、 方法是可以完成某个特定功能并且可以重复利用的代码片段。
方法的作用:提高代码的复用性,使代码更为规范、简洁。
代码遵循自上而下的顺序运行,main方法会被jvm自动调用,其他方法不被调用则不会执行。
2、方法的语法格式
[修饰符列表] 返回值类型 方法名 (形式参数列表){
方法体;
}
注:[]里面的内容表示可选 不是必须的;
方法体由java语句构成;
2.1 修饰符列表:
public static 可省略
2.2 返回值类型
返回值类型可以是任何合法的数据类型;
返回值一般指的是方法执行结束后的结果,通常是一个数据;
当一个方法执行结束不返回任何值时,返回值类型也不能省略,必须写上void关键字,所以void表示该方法执行结束不返回任何结果。
如果返回值类型不是void,再方法体执行结束时必须使用“return 值”来完成值的返回,否则编译会报错。
如果返回值类型是void,方法体中不能有“return 值”语句,但可以有“return;”
当return语句执行,当前方法必然结束。
2.3 方法名
要求首字母小写,后面每个单词首字母大写
2.4 形式参数列表
简称形参;
形式参数列表中的每一个参数都是“局部变量”,方法体结束之后内存释放;
形参的个数是0-N个;
形参有多个时,用逗号隔开。
public static void sumInt(){}
public static void sumInt(int x){}
public static void sumInt(int x, int y){}
public static void sumInt(int x, int y, double a, String s){}
2.5 方法体
由Java语句构成。
方法体中编写的时业务逻辑代码,完成某个特定功能。
3、方法的调用
方法必须调用之后才能执行。
调用的语法:
类名.方法名(实际参数列表);
实参和形参的类型和个数必须一一对应。
使用变量来接收方法的返回值,需要定义变量类型。
方法没有返回值时,不能用变量接收结果;方法有返回值时,也可以不接收。
在方法调用时,a()方法调用b()方法时,a和b都在同一个类中,“类名.”可以省略,如果不在同一个类中,“类名.”不能省略。
不是只有main方法才可以调用其他方法。
break;用来终止switch和离之最近的循环;
return;用来终止离之最近的一个方法。
在同一个域中,return下面不能再编写其他代码。
二、内存
1、 JVM中主要的三块内存空间:
栈、堆、方法区
方法区:
类加载器classloader,将硬盘上的xxx.class字节码文件装载到JVM时,
会将字节码文件存放到方法区中。方法区存储的是代码片段。
因为类需要加载,所以方法区中最先有数据。
栈内存 stack:
在方法被调用时,该方法需要的内存空间在栈中分配。
栈内存存储方法执行时的内存空间和局部变量。
方法调用:压栈,分配空间
方法结束:弹栈,释放空间
2、 栈数据结构
进栈、入栈、压栈、push
出栈、弹栈、pop
栈底元素、栈顶元素
栈帧永远指向栈顶元素;
处于栈顶部的元素具有活跃权;
栈数据结构的特点:
先进后出,后进先出。
三、方法重载
1、方法重载的优点:
代码整齐美观;
功能相似的代码方法名相同,易于代码编写和记忆。
2、方法的区分:
方法名相同时,编译器通过方法参数类型进行方法区分。
3、什么时候使用方法重载:
在同一个类中,两个方法的功能相似时,考虑方法名一致
什么时候代码会发生方法重载:
在同一个类中
方法名相同;
参数列表不同;(个数、类型、顺序)
同时满足以上三个条件
方法的重载与方法的返回值类型无关;
与修饰符列表无关。
四、方法的递归
1、 递归是指方法自己调用自己。
2、 当递归程序没有结束条件,会发生栈内存溢出错误:StackOverFlowError
因此递归必须要有结束条件
有结束条件也可能发生错误,是因为递归太深,栈内存不够。
当栈内存溢出错误发生:
先检查递归的结束条件是否正确;
若结束条件没问题,需手动调整JVM栈内存初始化大小。
java -Xss xxxGB xx.java
java -X 可以查看调整堆栈大小的参数
/*
计算1-n的和
*/
/*
// 使用for循环实现
public class RecursionSample01 {
public static void main(String[] args) {
int retValue1 = sum(3);
System.out.println(retValue1);
System.out.println(sum(10));
}
//计算1-n的方法
public static int sum(int n){
int result = 0;
for(int i = 1; i <= n; i++){
result += i;
}
return result;
}
}
*/
// 使用递归方法实现
public class RecursionSample01 {
public static void main(String[] args) {
int retValue2 = sum(10);
System.out.println(retValue2);
}
//递归方法
public static int sum(int n){
if (n == 1){
return 1;
}
return n + sum(n-1);
}
}