可变参数列表解决参数个数或者类型未知的场合
由于Object是顶级父类。所以可以用Object[] args 作为参数
Java SE5之前是没有可变参数的,所以我们通常这样创建数组
public class Demo1 {
static void print(Object[] args){
for (Object obj :args){
System.out.println(obj+" ");
}
}
public static void main(String[] args) {
Object[] objs = new Object[]{new Integer(11),new Float(22),new Boolean(true)};
print(objs);
System.out.println("------------------");
print(new Object[]{"one","two","three"});
System.out.println("------------------");
print(new Object[]{new Demo1(),new Demo1(),new Demo1()});
}
}
结果
11
22.0
true
one
two
three
Demo1@9807454
Demo1@3d494fbf
Demo1@1ddc4ec2
在Java SE5之中,我们可以这样写
public class Demo1 {
static void print(Object... args){
for (Object obj :args){
System.out.println(obj+" ");
}
}
public static void main(String[] args) {
Object[] objs = new Object[]{new Integer(11)};
print(objs);
print("one","two");
print(new Demo1(),new Demo1(),new Demo1());
}
}
结果
11
one
two
Demo1@5b6f7412
Demo1@27973e9b
Demo1@312b1dae
为什么参数里面没有填Object[] args 方法print却能遍历呢?
当你指定参数时,编译器自动填充到数组中。
总结就是:如果参数是数组,不用转换,如果不是数组,自动转换为数组。参数可以为任意类型。且编译器有自动包装机制,比如pring(11,new Integer(22),33)
;
更高级的用法
在一个方法中可以有可变参数,非可变参数同时存在,逗号分隔。
例如:
static void print(int i,Object... args){
System.out.println(i);
for (Object obj :args){
System.out.println(obj+" ");
}
}
结果
1
one
two
three
注意:关于重载问题
static void print(int i,Object… args)
static void print(Object… args)
这样不能同时存在;
static void print(int i,Object… args)
static void print(char j,Object… args)
可以同时存在;