方法之间的调用
一个方法可以调用另一个方法,方法本身也可以被其他方法调用。通过方法之间的互相调用,可以将复杂的业务逻辑拆分成多个独立的小步骤,形成清晰的调用链。
示例代码
package V054;
public class Test {
public static void main(String[] args) {
getMoney();
}
public static void valid() {
System.out.println("验证用户信息");
}
public static void check() {
valid();
System.out.println("查询金额");
}
public static void save() {
System.out.println("存入金额");
}
public static void getMoney() {
check();
System.out.println("取钱金额");
}
public static void trance() {
System.out.println("转账");
}
}Code language: JavaScript (javascript)
调用链分析
以 main 方法中调用 getMoney() 为例,执行流程如下:
main()
└── getMoney()
└── check()
├── valid() → 输出"验证用户信息"
└── 输出"查询金额"
└── 输出"取钱金额"Code language: JavaScript (javascript)
实际输出顺序:
验证用户信息
查询金额
取钱金额
方法调用关系图
| 方法 | 调用了哪些方法 |
|---|---|
main | getMoney() |
getMoney | check() |
check | valid() |
valid | 无(最底层) |
save | 无(未被调用) |
trance | 无(未被调用) |
方法调用的特点
| 特点 | 说明 |
|---|---|
| 独立栈帧 | 每次方法调用都会在栈中开辟独立的栈帧,方法结束后释放 |
| 调用深度 | 理论上无限制,但栈空间有限,过深会导致 StackOverflowError |
| 单向调用 | 被调用的方法不能直接返回数据给调用者以外的层级 |
| 可复用性 | valid() 被 check() 调用,也可被其他方法调用 |
递归调用(扩展)
方法也可以调用自身,称为递归。但需设置终止条件,否则会栈溢出:
public static void countDown(int n) {
if (n <= 0) {
return; // 终止条件
}
System.out.println(n);
countDown(n - 1); // 调用自身
}Code language: JavaScript (javascript)
注意事项
| 要点 | 说明 |
|---|---|
| 避免循环调用 | A 调用 B,B 又调用 A,无终止条件会导致栈溢出 |
| 方法未被调用 | 定义了但未被调用的方法不会执行 |
| 调用顺序 | 方法调用的顺序决定了执行顺序 |
| 栈溢出风险 | 递归或深层嵌套调用需设置合理的终止条件 |
Previous: 调用函数时的参数传递
Next: 练习——封装一个求数组最大值的函数