与C预言类似,Java中也有可变参数的形式。其格式如下:
public static void printInteger(int... integers);
在接收参数的时候,其参数格式可以是不定的,例如:
package com.example.vararguments;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
printInteger(); //无输出
printInteger(1); //输出1
printInteger(1, 2); //输出1 2
printInteger(1, 2, 3); //输出1 2 3
}
public static void printInteger(int... integers) {
for (int i : integers) {
System.out.print(i + " ");
}
System.out.println();
}
}
可变参数的形式类似于数组。在编译时,编译器会将最后一个可变形参转化为数组形参, 并在编译出的class文件里作上一个记号,表明这是个实参个数可变的方法。例如, 如果在类中再声明一个以数组作为形参的同名函数,将会报编译错误:
public static void printInteger(int [] integers); //编译错误,Duplicate method
而且,可以用数组实参来调用上述可变函数:
printInteger(new int [] {1, 2, 3, 4}); //输出1 2 3 4
但是,如果函数声明为数组形参,那么将不可以可变实参的形式调用该方法,例如:
package com.example.vararguments;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
printInteger(1, 2, 3); //编译错误
printInteger(new int [] {1, 2, 3, 4}); //正确输出1 2 3 4
}
public static void printInteger(int [] integers) {
for (int i : integers) {
System.out.print(i + " ");
}
System.out.println();
}
}
可变参数的另一个特点是:可变形参只能作为函数的最后一个形参,在其后面不能够再有其他形参,如:
public static void printInteger(int... integers, int count) //编译错误:The variable argument type int of the method printInteger must be the last parameter
同时,如果同时存在可变参数与固定参数,那么固定参数的优先级将会高于壳边参数,如下:
package com.example.vararguments;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
printInteger(1, 2); //输出:in fixed arguments: 1 2,说明调用了固定参数
}
public static void printInteger(int... integers) {
System.out.print("in var arguments: ");
for (int i : integers) {
System.out.print(i + " ");
}
System.out.println();
}
public static void printInteger(int n1, int n2) {
System.out.println("in fixed arguments: " + n1 + " " + n2);
}
}
总结:
1、可变形参类似于数组,可以以数组实参进行调用,反之则不行
2、可变形参必须作为最后一个参数存在。
3、可变形参的优先级低于固定形参。
参考文章:http://blog.csdn.net/justinavril/article/details/4674305