一、核心概述
可变参数(Variable Arguments)是 Java 5 引入的特性,允许方法接收任意数量的同类型参数,本质是语法糖,底层会自动转换为数组处理。
核心特点
● 方法参数列表中,可变参数只能有一个;
● 可变参数必须放在参数列表的最后一位;
● 调用方法时,可传入 0 个、1 个或多个同类型参数,也可直接传入数组。
二、基本语法
定义格式
// 格式:类型... 变量名(注意是三个点)
返回值类型 方法名(参数类型... 可变参数名) {
// 方法体(可变参数可当作数组使用)
}
简单示例
public class VarargsDemo {
// 定义可变参数方法:计算多个整数的和
public static int sum(int... nums) {
int total = 0;
// 可变参数 nums 本质是 int[] 数组,可通过增强 for 遍历
for (int num : nums) {
total += num;
}
return total;
}
public static void main(String[] args) {
// 调用方式1:传入 0 个参数
System.out.println(sum()); // 输出:0
// 调用方式2:传入 1 个参数
System.out.println(sum(5)); // 输出:5
// 调用方式3:传入多个参数
System.out.println(sum(1, 2, 3)); // 输出:6
// 调用方式4:传入数组(直接兼容数组)
int[] arr = {4, 5, 6};
System.out.println(sum(arr)); // 输出:15
}
}
三、关键注意事项
1. 可变参数的位置:必须是参数列表的最后一个,不能放在其他参数前面。
// 正确:可变参数在最后
public static void printInfo(String name, int... scores) {}
// 错误:可变参数不在最后(编译报错)
// public static void printInfo(int... scores, String name) {}
2. 方法重载冲突:避免定义可能与可变参数产生歧义的重载方法。
// 冲突示例:调用 print(1,2) 时,无法确定调用哪个方法
public static void print(int... nums) {}
public static void print(int a, int b) {}
3. 空值处理:若传入 null 作为可变参数,需注意空指针异常(NPE)。
public static void main(String[] args) {
int[] arr = null;
sum(arr); // 不会报错,但方法内遍历 nums 时会抛 NPE
// sum(null); // 等价于上面,同样有风险
// 正确处理:方法内先判空
public static int sum(int... nums) {
if (nums == null) return 0; // 避免 NPE
int total = 0;
for (int num : nums) total += num;
return total;
}
}
4. 与数组的区别:可变参数是数组的“简化写法”,但定义和调用更灵活。
// 数组参数方法:调用时必须传入数组
public static int sumArr(int[] nums) {}
sumArr(new int[]{1,2,3}); // 必须显式创建数组
// 可变参数方法:调用时可直接传多个值(自动转数组)
sum(1,2,3); // 无需手动创建数组