第一部分:方法重载概念
同一类中方法名相同、参数列表不同(个数、类型、顺序),与返回值无关
- 理解“同名不同参”的设计初衷
- 区分重载与重写的差异
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) { } // 顺序不同
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}); // 传入数组
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) { }
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(精确匹配优先)
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 版本
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 show(double a, int b) { }
show(1, 2); // 编译错误:歧义
可变参数与数组冲突
static void test(int[] arr) { }
static void test(int... arr) { }
// 调用 test(new int[]{1}) 编译错误
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);
}
}
}
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);
}
}
}
学习总结
- 重载:同名不同参,提高可读性
- 可变参数:简化调用,本质是数组
- 二者可组合,遵循精确匹配优先
- 注意歧义和参数顺序限制