【从零开始学Java | 第二十八篇】可变参数
前言我们经常会遇到这样一个场景我们需要写一个方法但传入该方法的参数个数是不确定的。比如写一个计算多个整数之和的方法你可能需要计算 2 个数的和也可能需要计算 5 个数甚至 100 个数的和。在 Java 5 之前为了解决这个问题我们通常只能要求调用者将数据封装到一个数组中传过来。这虽然能解决问题但代码写起来往往略显繁琐。为了提升开发体验Java 5 引入了一个非常实用的语法——可变参数Variable Arguments简称 Varargs。一、基本语法和使用可变参数的语法非常简单只需要在参数类型后面加上三个点...即可。语法格式修饰符 返回值类型 方法名(数据类型... 变量名) {// 方法体}场景演示求一组不确定个数的整数之和public class Test { public static void main(String[] args) { System.out.println(getSum(1, 2)); System.out.println(getSum(1, 2, 3, 4)); } public static int getSum(int...args){ int sum 0; for (int arg : args) { sum arg; } return sum; } }二、核心原理实际上可变参数在底层就是一个纯粹的数组。当你定义int... numbers时Java 编译器在编译生成.class字节码文件时会自动将其转换为int[] numbers。而当你在调用sum(1, 2, 3)时编译器实际上会偷偷帮你转换成sum(new int[]{1, 2, 3})。这就是为什么我们在方法内部可以使用增强for循环for-each或者numbers.length来操作它的原因。三、使用可变参数的三大规则1.可变参数必须放在参数列表的最后因为可变参数可以传入无限多个参数而后面如果跟着一个和可变参数类型一样的参数编译器就会混淆可变参数和不可变参数的界限。2.一个方法只能有一个可变参数还是与上一个出现的问题相同 编译器会混淆两个参数之间的界限。3.方法重载时的优先级Java 在解析重载方法时总是优先匹配精确的参数类型最后才考虑可变参数。public class OverloadDemo { public static void test(int a, int b) { System.out.println(调用了精确匹配的方法: test(int, int)); } public static void test(int... nums) { System.out.println(调用了可变参数的方法: test(int...)); } public static void main(String[] args) { test(1, 2); // 这里会输出什么 test(1, 2, 3); // 毫无疑问这里调用可变参数 } }总结底层是数组把它当作普通数组来处理即可。位置要放对必须且只能出现在参数列表的最后一位。重载优先级尽量避免与普通参数方法发生重载冲突。