面向对象学习笔记7 - 重载与可变参数
一、方法的重载(Overload)
1. 核心概念
方法重载遵循"两同一不同"原则:
• 相同类:必须在同一个类中
• 相同方法名
• 不同参数列表:
• 参数个数不同(如print(int)和print(int, int))
• 参数类型不同(如print(int)和print(String))
• 类型顺序不同(如print(int, String)和print(String, int))
2. 注意事项
• ❌ 无关因素:形参名称、权限修饰符、返回值类型
• ✅ 判断关键:方法名相同且形参列表相同即为相同方法
3. 经典面试题解析
public class InterviewTest {
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3};
System.out.println(arr); // 地址值
char[] arr1 = new char[]{'a', 'b', 'c'}; // 修正:char数组初始化
System.out.println(arr1); // abc
boolean[] arr2 = new boolean[]{true, true, false}; // 修正:拼写错误
System.out.println(arr2); // 地址值
}
}
运行结果分析:
• println(char[])有特殊处理直接输出内容
• 其他数组类型调用println(Object)输出地址值
二、可变个数形参方法(JDK5.0+)
1. 使用场景
处理形参类型确定但个数不确定的情况
2. 语法规范
public void print(int... nums) {
// 方法体
}
3. 调用规则
| 调用形式 | 合法 | 示例 |
|---|---|---|
| 0个参数 | ✅ | test.print() |
| 1个参数 | ✅ | test.print(1) |
| 多个参数 | ✅ | test.print(1,2) |
4. 重载优先级示例
public class ArgTest {
public void print(int... nums) {
System.out.println("1111");
}
public void print(int i) {
System.out.println("2222");
}
public void print(int i, int j) {
System.out.println("3333");
}
public static void main(String[] args) {
ArgTest test = new ArgTest(); // 修正类名拼写
test.print(); // 1111
test.print(1); // 2222
test.print(1, 2); // 3333
}
}
5. 特殊规则
- 禁止组合:
(int... nums, int i)非法 - 合法组合:
(int i, int... nums)合法 - 数组冲突:与
print(int[])不构成重载(编译报错)
三、开发注意事项
- 可变参数本质:编译器将可变参数视为数组处理
- 参数位置:可变参数必须作为最后一个形参
- 方法重载优先级:精确匹配优先于可变参数匹配
// 错误示例:可变参数非最后
public void errorExample(String... strs, int i) {}
// 正确示例:固定参数在前
public void validExample(int i, String... strs) {}
四、总结对比
| 特性 | 方法重载 | 可变参数 |
|---|---|---|
| 核心目的 | 处理不同参数场景 | 处理参数个数不确定 |
| 参数要求 | 必须不同参数列表 | 相同类型多个参数 |
| 语法特征 | 多个同名方法 | 参数类型后接... |
| 本质实现 | 编译器生成不同签名方法 | 编译器转换为数组处理 |

浙公网安备 33010602011771号