java不定参数String... args

先看两个简单的例子,来感觉一下Java的不定长度参数 
第一个例子: 
数组

Java代码  收藏代码spa

  1. public class VariArgs {  .net

  2.   

  3.     public static void main(String[] args) {  blog

  4.         test();  字符串

  5.         test("aaa");  get

  6.         test("aaa""bbb");  编译器

  7.         test("aaa""bbb""ccc");  it

  8.     }  编译

  9.   

  10.     public static void test(String... args) {  class

  11.         System.out.println(args.getClass());  

  12.         for (String arg : args) {  

  13.             System.out.println(arg);  

  14.         }  

  15.     }  

  16. }  


第二个例子: 

Java代码  收藏代码

  1. public class VariArgs {  

  2.   

  3.     public static void main(String[] args) {  

  4.         test("aaa");  

  5.         test("aaa""bbb");  

  6.         test("aaa""bbb""ccc");  

  7.     }  

  8.   

  9.     public static void test(String arg, String... args) {  

  10.         System.out.println(arg);  

  11.         System.out.println("----------------");  

  12.         for (String s : args) {  

  13.             System.out.println(s);  

  14.         }  

  15.     }  

  16. }  


   读者能够本身运行一下,这个不定长度参数的类型为String[],即字符串数组。 
从上面能够看出,若是一个方法的参数定为不定参数的话,这个参数能够根据参数个数动态生成一个数组,而后传入方法执行。 
    不过,不定参数有两个规定第一,方法的参数列表中最多只有一个不定长度的参数;第二,就是不定长度的数组的位置必须是最后一个参数。否则不能经过编译。 
    对于第一个规定,是由于若是有多于一个不定长度的参数,当真正调用这个方法的时候,JVM、将不知道前面的不定长度参数有多长, 下一个参数是从哪里开始. 
    对于第二个参数也是同样,编译器不知道不定长度参数的长度,没法肯定从哪里开始下一个参数。 
    如下是几种不正确使用不定长度参数的例子,请不要这样写程序: 

Java代码  收藏代码

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

  2.   

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

  4.   

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


   不定参数的方法能够重载。(你们都知道,重载就是方法名相同,而方法的参数列表不一样) 
   下面给出重载的示例: 

Java代码  收藏代码

  1. public class VariArgs {  

  2.   

  3.     public static void main(String[] args) {  

  4.         test("aaa");  

  5.         test("aaa""bbb");  

  6.         test("aaa""bbb""ccc");  

  7.     }  

  8.   

  9.     public static void test(Object... args) {  

  10.     }  

  11.   

  12.     public static void test(String arg, String... args) {  

  13.     }  

  14. }  


   读者若是细心的话,能够看出文章开头给出的两个例子的区别,就是第二个例子比第一个例子的test方法的参数多出了一个String arg,从感受上没有太大的区别,这有点像编译原理的*和+的区别。第一个test方法指能够有0或N个String作参数,但第二个test方法指至少一个String作为参数。 
   而后结合重载来看,把第一个例子和第二个例子合并成一个类,获得如下代码: 

Java代码  收藏代码

  1. public class VariArgs {  

  2.   

  3.     public static void main(String[] args) {  

  4.         test();  

  5.         test("aaa");  

  6.         test("aaa""bbb");  

  7.         test("aaa""bbb""ccc");  

  8.     }  

  9.   

  10.     public static void test(String... args) {  

  11.         System.out.println(args.getClass());  

  12.         for (String arg : args) {  

  13.             System.out.println(arg);  

  14.         }  

  15.     }  

  16.   

  17.     public static void test(String arg, String... args) {  

  18.         System.out.println(arg);  

  19.         System.out.println("----------------");  

  20.         for (String s : args) {  

  21.             System.out.println(s);  

  22.         }  

  23.     }  

  24. }  


    读者能够编译下这个程序,结果是编译不经过。为何呢?程序编译到第五行时,不能肯定test("aaa")该用第10行的test方法仍是第17行的方法,由于两个方法均可以有相同的参数列表。都能精确匹配上参数列表,编译器在这种状况下只好报出编译不能经过的错误。因此在重载这样的方法时,注意参数列表,不要使两个方法能够有一样的参数列表。

相关文章
相关标签/搜索