第一个例子:

public class VariArgs {  

    public static void main(String[] args) {
test();
test("aaa");
test("aaa", "bbb");
test("aaa", "bbb", "ccc");
} public static void test(String... args) {
System.out.println(args.getClass());
for (String arg : args) {
System.out.println(arg);
}
}
}

第二个例子:

public class VariArgs {  

    public static void main(String[] args) {
test("aaa");
test("aaa", "bbb");
test("aaa", "bbb", "ccc");
} public static void test(String arg, String... args) {
System.out.println(arg);
System.out.println("----------------");
for (String s : args) {
System.out.println(s);
}
}
}

运行一下,这个不定长度参数的类型为String[],即字符串数组。

从上面可以看出,如果一个方法的参数定为不定参数的话,这个参数可以根据参数个数动态生成一个数组,然后传入方法执行。

不过,不定参数有两个规定:第一,方法的参数列表中最多只有一个不定长度的参数;第二,就是不定长度的数组的位置必须是最后一个参数。不然不能通过编译。

对于第一个规定,是因为如果有多于一个不定长度的参数,当真正调用这个方法的时候,JVM、将不知道前面的不定长度参数有多长, 下一个参数是从哪里开始.

对于第二个参数也是一样,编译器不知道不定长度参数的长度,无法确定从哪里开始下一个参数。

【反例】以下是几种不正确使用不定长度参数的例子,请不要这样写程序:

public static void test(Object... objs, Object obj);  

public static void test(Object obj1, Object... objs, Object obj2);  

public static void test(Object... objs1, Object... objs2);  

不定参数的方法可以重载。(重载就是方法名相同,而方法的参数列表不同)

下面给出重载的示例:

public class VariArgs {  

    public static void main(String[] args) {
test("aaa");
test("aaa", "bbb");
test("aaa", "bbb", "ccc");
} public static void test(Object... args) {
} public static void test(String arg, String... args) {
}
}

可以看出文章开头给出的两个例子的区别,就是第二个例子比第一个例子的test方法的参数多出了一个String arg,从感觉上没有太大的区别,这有点像编译原理的*和+的区别。第一个test方法指可以有0或N个String做参数,但第二个test方法指至少一个String做为参数。

然后结合重载来看,把第一个例子和第二个例子合并成一个类,得到以下代码:

 public class VariArgs {  

     public static void main(String[] args) {
test();
test("aaa");
test("aaa", "bbb");
test("aaa", "bbb", "ccc");
} public static void test(String... args) {
System.out.println(args.getClass());
for (String arg : args) {
System.out.println(arg);
}
} public static void test(String arg, String... args) {
System.out.println(arg);
System.out.println("----------------");
for (String s : args) {
System.out.println(s);
}
}
}

编译这个程序,结果是编译不通过。为什么?程序编译到第五行时,不能确定test("aaa")该用第10行的test方法还是第17行的方法,因为两个方法都可以有相同的参数列表。都能精确匹配上参数列表,编译器在这种情况下只好报出编译不能通过的错误。所以在重载这样的方法时,注意参数列表,不要使两个方法可以有同样的参数列表。

参考:

http://blog.csdn.net/djun100/article/details/10134419(以上内容转自此篇文章)

Java的不定参数(eg:Object...)(转)的更多相关文章

  1. Java 反射 不定参数bug

    遇到的第一个关于反射的bug:java.lang.IllegalArgumentException: wrong number of arguments的问题解析如下: 1.错误bug wrong n ...

  2. java中不定参数的使用

    https://www.cnblogs.com/xy-hong/p/7192796.html

  3. Java不定参数Object… obj 和 Object[] 的区别

    Java不定参数Object… obj 和 Object[] 的区别 简述: java中方法重载可以实现参数不同自动匹配对应方法.但现实中也存在这种问题.普通传参对于形如下面的方法,却显得臃肿而失优雅 ...

  4. Java不定参数

    先看两个简单的例子,来感受一下Java的不定长度参数 第一个例子: public class VariArgs { public static void main(String[] args) { t ...

  5. Java中不定项参数(可变参数)的使用

    Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理. 注意事项:   1)不定项参数必须放在参数列表最后一个.   2)不定项参数只能有一个(多 ...

  6. 有关 java 不定参数

    不定参数实际为数组参数的一种写法而已,本质上与数组参数完全相同 //1.数组参数函数 public static int sum(int[] values) { } //2.不定参数函数 不定参数只能 ...

  7. 新手容易混乱的String+和StringBuffer,以及Java的方法参数传递方式。

    之前在交流群里和猿友们讨论string+和stringbuffer哪个速度快以及Java的方法参数传递的问题,引起了群里猿友的小讨论.最终LZ得出的结果是string+没有stringbuffer快, ...

  8. Jni中C++和Java的参数传递 参数对照

    Jni中C++和Java的参数传递 如何使用JNI的一些基本方法和过程在网上多如牛毛,如果你对Jni不甚了解,不知道Jni是做什么的,如何建立一个基本的jni程序,或许可以参考下面下面这些文章:利用V ...

  9. Java可变长参数方法调用问题

    不说废话,直接上代码: package mytest; import java.util.List; public class TestClass { public void method(List& ...

随机推荐

  1. 身份证号正则校验(js校验+JAVA校验)

    js校验身份证号[15位和18位] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 3 ...

  2. Pomodoro APP

    2015.5.23 UITableView 的数据源刷新问题 本次发过来的版本五,实现了活动清单列表(AllEventsTableViewController).活动详情(AllEventsViewC ...

  3. ios之UIActivityIndicatorView

    UIActivityIndicatorView和UIProgressView都继承自UIView,所以他们可以附属在其他视图上.UIActivityIndicatorView是一个进度提示器,显示一个 ...

  4. 全排列问题(DFS)

    题目描述: 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入格式: n(1≤n≤9) 输出格式: 由1-n组成的所有不重复的数字序列,每行一个序列 ...

  5. URAL1765 Error 404

    题目描述: vjudge 题解: STO ljx OTZ 下面这个算法是这位贡献的. 不妨将删去改为加入. 那么对于$n=p^k$,即只有一个质因子的$n$来说,若$i$已选,那么$i+n/p$.$i ...

  6. UVa-213-信息解码

    这题的话,我们只要理解题意,应该就不算很难. 我们可以开一个二维数组,用来存放对应的编码字符,第一个下表是length,第二个下标是value,这样一来,我们在读入数据的时候就进行处理,然后想要使用的 ...

  7. MySQL 查询优化之 Index Merge

    MySQL 查询优化之 Index Merge Index Merge Intersection 访问算法 Index Merge Union 访问算法 Index Merge Sort-Union ...

  8. Linux菜鸟起飞之路【四】绝对路径、相对路径及常用目录

    一.绝对路径与相对路径 Linux操作系统中存在着两种路径:绝对路径和相对路径.我们在访问文件或文件夹的时候,其实都是通过路径来操作的.两种路径在实际操作中能起到同等的作用. 在开始具体介绍之前,我们 ...

  9. json数据格式 与 for in

    格式一: var json1={ name:'json', age:'23' }; json1.name='金毛'; 格式二: (比较安全)  属性名字里有空格或者有连字符‘-’或者有保留字例如‘fo ...

  10. vim之替换命令

    格式:<range>s /<pat1>/<pat2>/gc <range>用来指定替换命令执行的范围: 百分号(%)表示所有行 点(.)表示当前行 美元 ...