JavaSE拓展:可变参数

一、什么是可变参数

可变参数(Varargs):方法的形参个数不固定,可以传 0 个、1 个或者多个同类型的参数 。 底层原理:可变参数本质就是一个数组,编译器在编译阶段,自动把传入的多个参数封装成数组。

应用场景:方法不确定接收多少个相同类型参数时使用。 语法格式:修饰符 返回值类型 方法名(数据类型... 变量名){} 重点符号:... 三个点,必须写在数据类型和参数名中间

二、基础语法 & 简单示例

java 复制代码
public class VarDemo {
    // 可变参数:可以传入任意多个int
    public static void show(int... nums){
        // nums本质就是数组,可以用数组所有操作
        for (int num : nums) {
            System.out.println(num);
        }
    }

    public static void main(String[] args) {
        show();         // 不传参数 → 空数组
        show(10);       // 传1个
        show(10,20);    // 传2个
        show(10,20,30); // 传多个
    }
}

三、可变参数的使用规则【面试重点】

  1. 一个方法最多只能有一个可变参数
java 复制代码
// ❌报错,不能写两个可变参数
public static void test(int... a, String... b){}
  1. 可变参数必须放在所有形参的最后面
java 复制代码
public static void test(String name, int... nums){} // ✅正确
public static void test(int... nums, String name){} // ❌编译报错!可变参数必须放末尾
  1. 可变参数可以接收数组,也可以接收零散的多个参数
java 复制代码
public static void show(int... nums){}
public static void main(String[] args) {
    int[] arr = {1,2,3};
    show(arr); // 直接传数组,允许
    show(1,2,3); // 传多个零散数字,允许
}
  1. 调用时可以不传可变参数的值,此时可变参数是长度为 0 的空数组,不是 null

⚠️注意:如果手动传入 null,那可变参数就是 null,遍历会空指针!

java 复制代码
show(null); // nums == null,增强for循环会NPE!

四、实际开发常用场景

场景 1:工具类求和

java 复制代码
public static int getSum(int... nums){
    int sum = 0;
    for (int num : nums) {
        sum += num;
    }
    return sum;
}
//调用 getSum(1,2) getSum(1,2,3,4)

场景 2:集合工具类 Arrays.asList(T... a)

java 复制代码
List<String> list = Arrays.asList("A","B","C");
// asList 底层就是可变参数,可以一次性传入多个元素

五、常见易错点汇总

  1. ... 不能写在变量名后面:int nums... ❌,必须 int... nums ✅
  2. 可变参数只能放在形参列表最后
  3. 一个方法只能有 1 个可变参数
  4. 可变参数本质数组,但直接传 null 会空指针
  5. 重载时,固定参数方法优先级高于可变参数
相关推荐
鬼手点金1 小时前
opencode-全能开发者配置
java·linux·服务器·前端·javascript·学习·前向传播
念越1 小时前
初中语数英答题与竞赛平台
java·数据库·spring boot
129Lab1 小时前
BMS 核心算法:SOC 估算从安时积分到 LSTM-UKF 串级融合的 30 年演进(附 Python 实现)
python·算法·lstm·python3.11·bms·soc估算
kgkg1 小时前
我通过逆向学到了douyin的美颜算法
算法
知守观1 小时前
一个半天需求干了三天:代码腐化的五个信号与自查命令
java·后端·代码规范
在角落发呆1 小时前
软件配置备份方法:从手动到自动化的实践指南
windows·安全
代码山河1 小时前
Java学习路线图:2026年最新版,从入门到架构师
java·学习·架构·教程·面向对象·项目
anew___1 小时前
《从零手写操作系统 (30):环境变量与进程上下文——export/unset与继承语义》
java·开发语言·网络·jvm·算法
Cx330❀2 小时前
Qt 多线程深度解析:从底层原理到 UI 线程与同步实战
开发语言·qt·ui·搜索引擎·性能优化·图形渲染