可变参数
/* * 可变参数:定义方法的时候不知道该定义多少个参数 * 格式: * 修饰符 返回值类型 方法名(数据类型… 变量名){ * * } * * 注意: * 这里的变量其实是一个数组 * 如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个 */ public class ArgsDemo { public static void main(String[] args) { // 2个数据求和 int a = 10; int b = 20; int result = sum(a, b); System.out.println("result:" + result); // 3个数据的求和 int c = 30; result = sum(a, b, c); System.out.println("result:" + result); // 4个数据的求和 int d = 30; result = sum(a, b, c, d); System.out.println("result:" + result); // 需求:我要写一个求和的功能,到底是几个数据求和呢,我不太清楚,但是我知道在调用的时候我肯定就知道了 // 为了解决这个问题,Java就提供了一个东西:可变参数 result = sum(a, b, c, d, 40); System.out.println("result:" + result); result = sum(a, b, c, d, 40, 50); System.out.println("result:" + result); } public static int sum(int... a) { int s = 0; for(int x : a){ s +=x; } return s; } }
可变参数底层其实是一个数组,下面是通过反编译工具参看的字节码内容:
import java.io.PrintStream; public class ArgsDemo { public ArgsDemo() { } public static void main(String args[]) { int a = 10; int b = 20; int result = sum(new int[] { a, b }); System.out.println((new StringBuilder("result:")).append(result).toString()); int c = 30; result = sum(new int[] { a, b, c }); System.out.println((new StringBuilder("result:")).append(result).toString()); int d = 30; result = sum(new int[] { a, b, c, d }); System.out.println((new StringBuilder("result:")).append(result).toString()); result = sum(new int[] { a, b, c, d, 40 }); System.out.println((new StringBuilder("result:")).append(result).toString()); result = sum(new int[] { a, b, c, d, 40, 50 }); System.out.println((new StringBuilder("result:")).append(result).toString()); } //可以看出在这里已经优化为一个数组了 public static transient int sum(int a[]) { int s = 0; int ai[]; int j = (ai = a).length; for (int i = 0; i < j; i++) { int x = ai[i]; s += x; } return s; } }