一. 方法的概念
概念:实现特定功能的一段代码,可以反复使用
【注】: 方法的本质是一种行为。
二. 方法的定义
定义语法:
public static void 方法名称() {
// 方法主体
}
经验: 将需要在多个位置重复使用的一组代码,定义在方法内部。
定义位置:
方法定义在类的内部,与main方法并列。
// 位置1
public class TestDefinitionFunction {
// 位置2
public static void main(String[] args) {
// 位置3
}
// 位置4
}
// 位置5
正确位置: 位置2、位置4
【例】:
public class TestFunction {
public static void main(String[] args) {
System.out.println("床前明月光");
printSign();
System.out.println("疑是地上霜");
printSign();
System.out.println("举头望明月");
printSign();
System.out.println("低头思故乡");
printSign();
}
// 定义:打印10个分割符的函数
public static void printSign() {
for (int i = 1; i <= 10; i++) {
System.out.print("-");
}
System.out.println();
}
}
【注】: 调用方法时,会优先执行方法内部的代码,结束后,返回到方法调用处,继续向下执行。
【注】: 一个类中可以有多个方法,方法之间属于并列关系,不可嵌套。
经验: 一个方法只做一件事。
三. 方法的组成
方法的参数:
参数的概念:
调用方法时,所传入的数据。
多数情况下,方法与调用者之间需要数据的交互;调用者必须提供数据,才能使方法完成相应的功能。
比如,取款时需要提供取款金额。
方法的参数可以让代码功能更灵活,普适性、可维护性更高。
形参与实参:
定义语法:
public static void 方法名称 ( 形式参数 ) {
// 方法主体
}
调用语法:
方法名称 ( 实际参数 );
【注】: “形参”等价于“局部变量的声明”
【注】: “实参”等价于“局部变量的赋值”
【注】: 参数可以有单个,也可有多个,也可以没有参数。
返回值与返回类型:
返回的概念:
方法执行后的返回结果。
- 方法 —— 行为
- 返回值 —— 行为的目的
方法执行后,一些情况下无需返回结果;另一些情况下必须返回结果。
定义语法:
public static 返回值类型 方法名称 ( 形式参数 ) {
// 方法主体
return 返回值;
}
调用语法:
变量 = 方法名称 ( ); // 变量类型与返回值类型一致
返回类型:
返回类型需要与返回值的数据类型相匹配。
【注】: 一个方法只能有一个返回值,当方法存在分支结构时,必须保证每一条分支都具有正确的返回值。
void :
如果方法行为本身就是使用者要达到的目的,则使用void。
【注】: 若方法有返回值,一定要有东西来"消化"该返回值。 方法的返回值有两种消化方式
- 通过变量的存储来消化
- 通过参数来消化返回值
public static void 方法名称() {
// 方法主体
}
return 关键字 :
- 应用在具有返回值类型的方法中:
- return value; // 表示结束当前方法,并伴有返回值,返回到方法调用处。
- 应用在没有返回值类型(void) 的方法中:
- return; // 表示结束当前方法,直接返回到方法调用处。
四. 方法的好处
好处:
- 减少代码冗余
- 提高复用性
- 提高可读性
- 提高可维护性
- 方便分工合作
五. 方法的调用
多级调用
public class InvokeTest {
public static void main(String[] args) {
m1();
}
public static void m1() {
System.out.println("m1()/start");
m2();
System.out.println("m1()/end");
}
public static void m2() {
System.out.println("m2()/start");
System.out.println("m2()/end");
}
}
结果为:
m1()/start
m2()/start
m2()/end
m1()/end
无穷递归
当方法调用自己时,没有正确的出口条件,则产生无穷递归。
public class InvokeTest {
public static void main(String[] args) {
m1();
}
public static void m1() {
System.out.println("m1()/start");
m1();
System.out.println("m1()/end");
}
}
结果为:
m1()/start
m1()/start
m1()/start
m1()/start…
Exception in thread “main” java.lang.StackOverflowError
内存溢出异常
六. 递归
递归的概念:
解决具有既定规律的问题时,在方法内部再次调用自身方法的一种编程方式。
何时使用递归:
当要解决的问题可以拆分成若干个小问题,大小问题的解决方式相同,方法中自己调用自己。
使用循环解决的常规问题,都可以替换为递归解决。
如何正确使用递归:
设置有效的出口条件,可以让调用链上的每个方法都可以正确返回,避免无穷递归。
【例】:
// 循环阶乘
public static int factorial_loop(int n) {
int sum = 1;
for (int i = 1; i <= n; i++) {
sum *= i;
}
return sum;
}
// 递归阶乘
public static int factorial_recursion(int n) {
if (n == 0) {
return 1;
}
return n * factorial_recursion(n-1);
}