一、什么是可变参数
可变参数(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); // 传多个
}
}
三、可变参数的使用规则【面试重点】
- 一个方法最多只能有一个可变参数
java
// ❌报错,不能写两个可变参数
public static void test(int... a, String... b){}
- 可变参数必须放在所有形参的最后面
java
public static void test(String name, int... nums){} // ✅正确
public static void test(int... nums, String name){} // ❌编译报错!可变参数必须放末尾
- 可变参数可以接收数组,也可以接收零散的多个参数
java
public static void show(int... nums){}
public static void main(String[] args) {
int[] arr = {1,2,3};
show(arr); // 直接传数组,允许
show(1,2,3); // 传多个零散数字,允许
}
- 调用时可以不传可变参数的值,此时可变参数是长度为 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 底层就是可变参数,可以一次性传入多个元素
五、常见易错点汇总
...不能写在变量名后面:int nums...❌,必须int... nums✅- 可变参数只能放在形参列表最后
- 一个方法只能有 1 个可变参数
- 可变参数本质数组,但直接传 null 会空指针
- 重载时,固定参数方法优先级高于可变参数