第一部分:方法重载概念

同一类中方法名相同、参数列表不同(个数、类型、顺序),与返回值无关

  • 理解“同名不同参”的设计初衷
  • 区分重载与重写的差异

add(int,int)

1 + 2

add(double,double)

1.5 + 2.5

add(String,String)

"Hello" + "World"

第二部分:重载判定规则

1

三要素

  • 方法名相同
  • 参数列表不同(个数、类型、顺序)
  • 与返回值、修饰符无关
2

合法重载示例

void print(int a) { }
void print(double a) { }
void print(int a, double b) { }
void print(double a, int b) { } // 顺序不同

第三部分:可变参数(Varargs)

语法:类型... 变量名,本质是数组

1

基本语法

static int sum(int... nums) {
    int total = 0;
    for (int n : nums) total += n;
    return total;
}

// 调用方式
sum(); // 0
sum(1,2); // 3
sum(new int[]{1,2,3}); // 传入数组
2

参数位置限制

// 正确:可变参数必须放在最后
static void log(String level, String... msgs) { }

// 错误:普通参数不能在可变参数之后
// static void test(String... a, int b) { }

第四部分:重载 + 可变参数联合设计

1

优先级规则

static void print(int a) { System.out.println("int"); }
static void print(int... a) { System.out.println("varargs"); }

print(1); // 输出 int(精确匹配优先)
2

实用案例:平均数计算

static double avg(double... nums) {
    return Arrays.stream(nums).average().orElse(0);
}

static double avg(int... nums) {
    return Arrays.stream(nums).average().orElse(0);
}

// 调用
avg(1,2,3); // 使用 int 版本
avg(1.1,2.2); // 使用 double 版本

第五部分:常见错误

歧义调用

static void show(int a, double b) { }
static void show(double a, int b) { }

show(1, 2); // 编译错误:歧义

可变参数与数组冲突

static void test(int[] arr) { }
static void test(int... arr) { }

// 调用 test(new int[]{1}) 编译错误

第六部分:综合实战

实战:万能格式化输出工具

public class Formatter {
    public static void main(String[] args) {
        printLine("-", 30);
        printLine("*", 10, 3);
        printLine();
    }

    // 无参:默认 50 个 '-'
    static void printLine() {
        printLine("-", 50);
    }

    // 指定字符和长度
    static void printLine(String ch, int len) {
        System.out.println(String.valueOf(ch).repeat(len));
    }

    // 可变长度多行
    static void printLine(String ch, int... lens) {
        for (int len : lens) {
            printLine(ch, len);
        }
    }
}

学习总结

  • 重载:同名不同参,提高可读性
  • 可变参数:简化调用,本质是数组
  • 二者可组合,遵循精确匹配优先
  • 注意歧义和参数顺序限制