scjp中关于可变参数列表的疑问

首先请看如下两段代码

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文章版权属于作者,受法律保护。没有作者书面许可不得转载。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值