面向对象学习笔记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. 特殊规则

  1. 禁止组合(int... nums, int i) 非法
  2. 合法组合(int i, int... nums) 合法
  3. 数组冲突:与print(int[])不构成重载(编译报错)

三、开发注意事项

  1. 可变参数本质:编译器将可变参数视为数组处理
  2. 参数位置:可变参数必须作为最后一个形参
  3. 方法重载优先级:精确匹配优先于可变参数匹配
// 错误示例:可变参数非最后
public void errorExample(String... strs, int i) {} 

// 正确示例:固定参数在前
public void validExample(int i, String... strs) {}

四、总结对比

特性 方法重载 可变参数
核心目的 处理不同参数场景 处理参数个数不确定
参数要求 必须不同参数列表 相同类型多个参数
语法特征 多个同名方法 参数类型后接...
本质实现 编译器生成不同签名方法 编译器转换为数组处理
posted @ 2025-03-06 21:30  谁来着?  阅读(12)  评论(0)    收藏  举报