含义
Java 5中提供了可变长参数,允许在调用方法时传入不定长度的参数。变长参数本质上还是基于数组的实现:
void foo(String... args);
void foo(String[] args);
void foo(int... arrys);
void foo(float... arrys);
……
一般在不确定方法需要处理的对象的数量时可以使用可变长参数,会使得方法调用更简单,无需手动创建数组 new T[]{…} 。
定义方法
在定义方法时,在最后一个形参后加上三点 …,就表示该形参可以接受多个参数值,多个参数值被当成数组传入。上述定义有几个要点需要注意:
-
可变参数只能作为函数的最后一个参数,但其前面可以有也可以没有任何其他参数
-
运行时要注意优先级问题:系统一般先匹配确定参数的方法,没有再去匹配调用不定项参数的方法
-
由于可变参数必须是最后一个参数,所以一个函数最多只能有一个可变参数!!!
-
Java的可变参数,会被编译器转型为一个数组
-
变长参数在编译为字节码后,在方法签名中就是以数组形态出现的。这两个方法的签名是一致的,不能作为方法的重载。如果同时出现,是不能编译通过的。可变参数可以兼容数组,反之则不成立
-
使用 Object… 作为变长参数:int[] 无法转型为 Object[], 因而被当作一个单纯的数组对象 ; Integer[] 可以转型为 Object[], 可以作为一个对象数组:
public void foo(Object... args) {
System.out.println(args.length);
}
foo(new String[]{"arg1", "arg2", "arg3"}); //结果是:3
foo(100, new String[]{"arg1", "arg1"}); //结果是:2
foo(new Integer[]{1, 2, 3}); //结果是:3
foo(100, new Integer[]{1, 2, 3}); //结果是:2
foo(1, 2, 3); //结果是:3
foo(new int[]{1, 2, 3}); //结果是:1
代码示例:
package com.test;
import java.util.Arrays;
public class Test1 {
public static int count(int... arry) {
int result = 0;
for(int temp : arry) {
result += temp;
}
return result;
}
public static int sum(int[] arry) {
int result = 0;
for(int temp : arry) {
result += temp;
}
return result;
}
public void getStr(String... str) {
for(String temp : str) {
System.out.println(temp);
}
}
public static int getNum(Object... arry) {
return arry.length;
}
public static void main(String[] args) {
int num1 = new Test1().count(new int[]{1,2,3,4,5,6,7});
int num2 = new Test1().sum(new int[] {1,2,3,4,5,6,7});
int num3 = new Test1().getNum(123456,new int[] {1,2,3,4,5,6,7});
new Test1().getStr(new String[] {"这是第一行字符串","这是第二行字符串","这是第三行字符串","这是第四行字符串"});
System.out.println(num1);//输出结果是:28
System.out.println(num2);//输出结果是:28
System.out.println(num3);//输出结果是:2
}
}