Java不定參數


先看兩個簡單的例子,來感受一下Java的不定長度參數 
第一個例子: 

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. }  


第二個例子: 

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行的方法,因為兩個方法都可以有相同的參數列表。都能精確匹配上參數列表,編譯器在這種情況下只好報出編譯不能通過的錯誤。所以在重載這樣的方法時,注意參數列表,不要使兩個方法可以有同樣的參數列表。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM