元数据卡
- 前置知识:方法定义与调用(第5章)
- 预计时间:10 分钟
- 阅读模式: 轻松
- 完成标志:能写出重载方法,理解方法签名的概念
本章分层
- 必读:方法重载的规则
- 选读:方法重载的工程运用
- 进阶:无
第八幕:同一个名字,不同的兵器
"师傅,打剑是 forgeSword,打盾牌难道要叫 forgeShield?"
"不用,"老陈笑了,"就叫 forge。传进来的东西不同,我做的自然不同。"
java
public class Forge {
public static void main(String[] args) {
System.out.println(forge("铁", 3)); // 打铁剑
System.out.println(forge("钢", 5)); // 打钢剑
System.out.println(forge("橡木", 4)); // 打木盾
System.out.println(forge("龙鳞", 2, 10)); // 打龙鳞甲,+10防御
}
static String forge(String material, int level) {
return level >= 4
? "精良" + material + "剑"
: "普通" + material + "剑";
}
// 同名方法:参数数量不同
static String forge(String material, int level, int defense) {
return "防御+" + defense + "的" + material + "甲(等级" + level + ")";
}
}语言:Java 21 如何运行:javac Forge.java && java Forge预期输出:
普通铁剑
精良钢剑
精良橡木剑
防御+10的龙鳞甲(等级2)这叫方法重载(method overloading):同一个方法名,不同参数列表。
编译器根据你调用时传的参数,自己决定用哪个版本——三个参数走第二个 forge,两个参数走第一个。
第九幕:重载的规则
规则一字不改:
- 必须参数列表不同:数量、类型、顺序,至少满足一个
- 光返回类型不同不够:编译器只看你传了什么
java
// 编译错误:仅返回类型不同
static int calc(int a) { return a * 2; }
static double calc(int a) { return a * 2.0; }参数类型不同的正规重载:
java
public class CalcDemo {
public static void main(String[] args) {
System.out.println(add(3, 5)); // 整数版
System.out.println(add(3.0, 5.0)); // 浮点版
}
static int add(int a, int b) { return a + b; }
static double add(double a, double b) { return a + b; }
}预期输出:8 和 8.0
两个 add 同名但参数类型不同——编译器自己挑。
C++ 差异: C++ 还支持默认参数,可替代部分重载:
forge(const std::string& material, int level = 3);可只传一个参数调用。Java 没有默认参数——重载是唯一方案。
第十幕:常见陷阱
陷阱一:方法太长
一个方法写了一二百行?你遇到了典型的"大方法"反模式。
java
// 不要这样
static void processOrder() {
// 验证
// 计算价格
// 计算折扣
// 更新库存
// ... 二百行代码
}每做一个独立的事情就提取成一个方法:
java
// 这样
static void processOrder() {
validateOrder();
calculatePrice();
updateInventory();
sendConfirmation();
generateReceipt();
}这就像老陈的铁匠铺——每道工序一个人,分工明确。
陷阱二:魔法数字
java
double total = price * 0.85;
if (score > 60) { ... }这些数字什么意思?半年后你自己也看不懂。用方法封装:
java
static double applyDiscount(double price) {
return price * getDiscountRate();
}
static double getDiscountRate() {
return 0.85; // 85折
}小技巧:如果你发现一段代码需要加注释才能解释它在做什么——提取它成一个方法,方法名就是注释。
旅人笔记
方法重载:同名不同参数。编译器根据实参类型决定用哪个版本。规则:参数列表必须不同(数量、类型、顺序),仅返回类型不同不够。记住一句话:一个方法做一件事,不同材料用同一个名。
→ 下一站:递归
你已经学会了方法调方法,一层一层搭起调用栈。但如果一个方法调用自己呢?听起来像俄式套娃,也像通往无限深渊的阶梯。它会压爆你的调用栈吗?它比循环更强大还是更危险?第5+章,我们走进递归。