明天就要上班啦,今天制定10月计划,每天要做哪些事情,到月底要达到什么的目标!突然想去看电影啦!!!
说起可变参数,我们先看下面代码段,对它有个直观的认识,下方的sum方法明确地解释了可变参数的意思
1 public class VarargsDemo{
2
3 static int sum(int... args) {
4 int sum = 0;
5 for(int arg:args)
6 sum += arg;
7 return sum;
8 }
9 public static void main(String args[]) throws FileNotFoundException {
10 System.out.println(sum(1,2,3,4,5,6,7,8,9));
System.out.println(sum(1,2,3,4,5,6));
System.out.println(sum(1,2,3);
11 }
12 }
- Effective java书中定义:
jdk1.5发行版增加了可变参数方法,一般称作variable arity method(可匹配不同长度的变量的方法)。可变参数方法接受0个或者多个指定类型的参数。可变参数机制通过先创建一个数组,数组的大小为在调用位置所传递的参数数量,然后将参数值传到数组中,最后将数组传递给方法。
可变参数的机制原理:
1.创建一个array[],它的size就是所传参数的个数;
2.将参数放入到array[]中;
3.将array[]传给方法。
看起来这个可变参数非常的便利,我们不用去考虑参数的个数,随心所欲的使用。但是这个观点不对,它给我带来便利的同时,也有很多潜在的危险,我们要慎重使用。
当我们需要定义参数数目不定的方法时,可变参数时一种很方便的方式,但是不应该被过度滥用,参数列表不应该只有一个可变参数,避免调用方一个参数也不传导致程序出现问题.应该如下所示,用一个固定参数来进行区分
1.如果所传参数为null,方法里有对参数的引用(比如 args[0])时,那么就会在运行时失败(编译时却检测不出错误);
2.在对性能有要求时,我们要慎重考虑是否使用可变参数。因为,可变参数方法的调用都会引起array的内存分配和初始化,这会给性能带来损耗。
- 错误做法: 下面是一个可变参数方法,带有int参数的一个序列,并返回它们的总和。正如你期望的,sum(1,2,3)的值为6,sum()的值为0。
public static void main(String[] args) {
int sum = sum();
System.out.println(sum);
}
public static int sum(int... args){
int sum = 0;
for (int arg : args) {
sum += arg;
}
return sum;
}
- 正确做法 声明该方法带有两个参数,一个是指定类型的正常参数,另一个是这种类型的varargs参数。
public static void main(String[] args) {
int sum = sum(1, 3, 4, 5, 6, 7, 8, 9);
System.out.println(sum);
}
public static int sum(int first,int... args){
for (int arg : args) {
first = first + arg;
}
return first;
}
特别提醒
当可变参数的使用发生变动时(比如:以前用可变参数方法,现在用普通方法),所有引用参数列表的类的.class都要重新生成,因为可变参数的array的分配和初始化是在编译期间完成的。
- 参考: