package variablearglist.one;
public class Main {
public static void variablearglist(Object... os){
System.out.print("[");
for (Object i : os) {
System.out.print(i + ",");
}
System.out.println("]");
}
// public static void variablearglist(int... is) {
// System.out.print("[");
// for (int i : is) {
// System.out.print(i + ",");
// }
// System.out.println("]");
// }
public static void main(String[] args) {
System.out.println("多参数输出:");
variablearglist(1,2,3,4,5);
int[] intArray=new int[]{1,2,3,4,5};
System.out.println("基本类型数组输出:");
variablearglist(intArray);
Integer[] intObjArray=new Integer[]{
new Integer(0),new Integer(1),new Integer(2)
};
System.out.println("包装类型数组输出:");
variablearglist(intObjArray);
/*
* Output:
* 多参数输出:
* [1,2,3,4,5,]
* 基本类型数组输出:
* [[I@24065c4,]
* 包装类型数组输出:
* [0,1,2,]
*/
}
}
注:如果参数列表是Object… os且输入是多参数列表,则编译器会将多个基本类型元素包装为相应包装类数组(见 多参数输出),再传参;如果参数列表是Object… os且输入是基本类型数组(见 基本类型数组输出),则编译器无法转换,会将整个数组看成一个参数传入;如果参数列表是Object… os且输入是引用类型数组,则直接传参(见 包装类型数组输出)。
package variablearglist.one;
public class Main {
// public static void variablearglist(Object... os){
// System.out.print("[");
// for (Object i : os) {
// System.out.print(i + ",");
// }
// System.out.println("]");
// }
public static void variablearglist(int... is) {
System.out.print("[");
for (int i : is) {
System.out.print(i + ",");
}
System.out.println("]");
}
public static void main(String[] args) {
System.out.println("多参数输出:");
variablearglist(1,2,3,4,5);
int[] intArray=new int[]{1,2,3,4,5};
System.out.println("基本类型数组输出:");
variablearglist(intArray);
// Integer[] intObjArray=new Integer[]{
// new Integer(0),new Integer(1),new Integer(2)
// };
// System.out.println("包装类型数组输出:");
// variablearglist(intObjArray);
/*
* Output:
* 多参数输出:
* [1,2,3,4,5,]
* 基本类型数组输出:
* [1,2,3,4,5,]
*/
}
}
注:如果参数列表是int… is且输入是多参数列表,则编译器会将多个基本类型元素包装为相应基本类型数组(见 多参数输出),再传参;如果参数列表是int… is且输入是基本类型数组(见 基本类型数组输出),则直接传参;同第一段代码对比,若输入类型为基本类型数组时,可变参数列表必须为对应基本类型加…若为Object…则编译器会将输入的基本类型数组看为一个元素传参。
package variablearglist.one;
public class Main {
public static void variablearglist(Object... os){
System.out.print("[");
for (Object i : os) {
System.out.print(i + ",");
}
System.out.println("]");
}
public static void variablearglist(int... is) {
System.out.print("[");
for (int i : is) {
System.out.print(i + ",");
}
System.out.println("]");
}
public static void main(String[] args) {
System.out.println("多参数输出:");
variablearglist(1,2,3,4,5);//The method variablearglist(Object[]) is ambiguous for the type Main
int[] intArray=new int[]{1,2,3,4,5};
System.out.println("基本类型数组输出:");
variablearglist();//The method variablearglist(Object[]) is ambiguous for the type Main
}
}
注:下面两行代码:
variablearglist(1,2,3,4,5);
variablearglist();
会有编译错误,编译器无法区分,调用的是哪一个方法。其中,第二行代码编译错误可以通过定义一个无参重载方法来解决。可变参数列表尽量少用(容易混淆,且方法的参数列表不够清晰,则会导致重载方法变得复杂)。