跳到内容

元数据卡

  • 前置知识:方法定义与调用(第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; }
}

预期输出88.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+章,我们走进递归

Built with VitePress | Software Systems Atlas