首先请看如下两段代码
有人会问了为什么第一段代码会报编译时错误,而第二段代码不会报错呢。
首先这里需要简单了解一下java5中新增的特性“可变参数列表”。
以(Object... obj)这样的形式声明一个数组型参数的方法就是可变参数列表,这样的好处有两个:
1.可以在使用这个方法的时候传入任意(甚至可以不传入任何参数)多个Object类型的参数
2.不必须在调用方法之前创建好数组后,才能把参数传入该方法,可变参数列表会自动将这些参数封装成为一个数组
这里有几点需要注意的地方:
1.可变参数列表本质上就是数组
2.Object可以用任何的类型替代
3.在一个方法中只能有一个可变参数列表,并且只能放在所有参数的最后一个位置上
好了,现在大家基本上了解了可变参数列表这个新的语言特性,下面回到文章开始的两段代码上来,第一段代码有两个方法method(String[] names)和method(String... names),根据刚刚讲到的可变参数列表本质上就是数组,也就是说String[] names与String... names这两种参数声明方式完全相同,所以这两个方法签名完全相同,不能够实现方法重载(Overload),会产生编译时错误(Compile Error)。
第二段的代码,有两个方法method(String[] names)和method(String name,String... names),参数的数量不相同,所以可以实现方法重载(Overload),不会产生任何错误。
最后使用一段代码来说明如何正确使用含有可变参数列表的方法
补充:
为了让大家更好的理解可变参数列表就是数组,请看如下代码:
这里的public static void main(String... args)与public static void main(String[] args)完全相同
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
public class Overload {
public void method(String[] names) {
for (String string : names) {
System.out.println(string);
}
}
public void method(String... names) {
for (String string : names) {
System.out.println(string);
}
}
}
public class Overload {
public void method(String[] names) {
for (String string : names) {
System.out.println(string);
}
}
public void method(String name,String... names) {
for (String string : names) {
System.out.println(string);
}
}
}
有人会问了为什么第一段代码会报编译时错误,而第二段代码不会报错呢。
首先这里需要简单了解一下java5中新增的特性“可变参数列表”。
以(Object... obj)这样的形式声明一个数组型参数的方法就是可变参数列表,这样的好处有两个:
1.可以在使用这个方法的时候传入任意(甚至可以不传入任何参数)多个Object类型的参数
2.不必须在调用方法之前创建好数组后,才能把参数传入该方法,可变参数列表会自动将这些参数封装成为一个数组
这里有几点需要注意的地方:
1.可变参数列表本质上就是数组
2.Object可以用任何的类型替代
3.在一个方法中只能有一个可变参数列表,并且只能放在所有参数的最后一个位置上
好了,现在大家基本上了解了可变参数列表这个新的语言特性,下面回到文章开始的两段代码上来,第一段代码有两个方法method(String[] names)和method(String... names),根据刚刚讲到的可变参数列表本质上就是数组,也就是说String[] names与String... names这两种参数声明方式完全相同,所以这两个方法签名完全相同,不能够实现方法重载(Overload),会产生编译时错误(Compile Error)。
第二段的代码,有两个方法method(String[] names)和method(String name,String... names),参数的数量不相同,所以可以实现方法重载(Overload),不会产生任何错误。
最后使用一段代码来说明如何正确使用含有可变参数列表的方法
public class Overload {
public void method(String... names) {
for (String string : names) {
System.out.println(string);
}
}
public static void main(String[] args) {
Overload ol = new Overload();
String[] strings = {new String("a"),"b"};
ol.method(strings); //可以使用传入数组的方式调用方法
ol.method("a","b"); //也可以使用普通参数方式调用方法
ol.method(); //甚至不传入任何参数
}
}/* Output:
a
b
a
b
*/
补充:
为了让大家更好的理解可变参数列表就是数组,请看如下代码:
public class VariantList {
public static void main(String... args) {
System.out.println("main方法的参数也可以是String... args");
}
}/* Output:
main方法的参数也可以是String... args
*/
这里的public static void main(String... args)与public static void main(String[] args)完全相同
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。