隨筆-72  評論-20  文章-0  trackbacks-1
          1.可變參數列表的簡單實現
          當調用方法時,方法的參數個數或類型未知時,稱其為可變參數列表。在以前的Java代碼中,可以使用Object數組來實現這樣的功能。因為,所有的類都是直接或間接繼承于Object類。
           
          VarArgs.java
          package sample;
           
          class A1{}
           
          public class VarArgs {
                 static void printArray(Object[] args){
                        for(Object obj:args)
                               System.out.print(obj+" ");
                        System.out.println();
                 }
           
                 public static void main(String[] args){
                        printArray(new Object[]{
                               new Integer(47),new Float(3.14),new Double(11.11) 
                        });
                        printArray(new Object[]{"one","two","three"});
                        printArray(new Object[]{new A1(),new A1(),new A1()});
                 }
          }
           
          結果:
          47 3.14 11.11
          one two three
          sample.A1@a90653 sample.A1@de6ced sample.A1@c17164
           
          這里printArray方法使用Object數組作為參數,并使用foreach語法遍歷數組,打印每個對象。
           
          2.Java SE5實現可變參數列表
          同樣的方法,參數可以這樣定義,(Object…args),這樣達到同樣的效果。
           
          NewVarArgs.java
          package sample;
           
          class A{}
           
          public class NewVarArgs {
                 static void printArray(Object...args){
                        for(Object obj:args)
                               System.out.print(obj+" ");
                        System.out.println();
                 }
           
                 public static void main(String[] args){
                        printArray(new Integer(47),new Float(3.14),new Double(11.11));
                        printArray(47,
                        printArray("one","two","three");
                        printArray(new A(),new A(),new A());
                        printArray((Object[])new Integer[]{1,2,3,4});
                        printArray();
                 }
          }
           
          結果:
          47 3.14 11.11
          47 3.14 11.11
          one two three
          sample.A@a90653 sample.A@de6ced sample.A@c17164
          1 2 3 4
           
          這里沒有顯式的使用數組作為參數,但編譯器實際上會為你填充數組。所以同樣可以使用foreach語法來遍歷之。
          注意倒數第二行,編譯器已經發現它是一個數組,所以不會在其上執行任何轉換。最后一行表明,可以傳遞零個參數。
          也可以指定所有可變參數的類型,下面的程序指定所有可變參數都必須是String。
           
          OptionalArguments.java
          package sample;
           
          public class OptionalArguments {
                 static void f(String...trailing){
                        for(String s:trailing)
                               System.out.print(s+" ");
                        System.out.println();
                 }
           
                 public static void main(String[] args){
                        f("one");
                        f("two","three");
                        f();
                 }
          }
           
          結果:
          one
          two three
           
          可以在可變參數列表中同時使用原始類型與包裝類。
           
          AutoboxingVarargs.java
          package sample;
           
          public class AutoboxingVarargs {
                 public static void f(Integer...args){
                        for(Integer i:args)
                               System.out.print(i+" ");
                        System.out.println();
                 }
           
                 public static void main(String[] args){
                        f(new Integer(1),new Integer(2));
                        f(3,4,5,6,7,8,9);
                        f(10,new Integer(11),12);
                 }
          }
           
          結果:
          1 2
          3 4 5 6 7 8 9
          10 11 12
           
          3.可變參數列表的重載(Overloading)
          如果出現重載的情況,則編譯器會自動調用最適合的方法匹配之。
           
          OverloadingVarargs.java
          package sample;
           
          public class OverloadingVarargs {
                 static void f(Character...args){
                        System.out.print("first ");
                        for(Character c:args)
                               System.out.print(c+" ");
                        System.out.println();
                 }
           
                 static void f(Integer...args){
                        System.out.print("second ");
                        for(Integer i:args)
                               System.out.print(i+" ");
                        System.out.println();
                 }
                
                 static void f(Long...args){
                        System.out.print("third ");
                        for(Long l:args)
                               System.out.print(l+" ");
                        System.out.println();
                 }
                
                 static void f(Double...args){
                        System.out.print("forth ");
                        for(Double d:args)
                               System.out.print(d+" ");
                        System.out.println();
                 }
                
                 public static void main(String[] args){
                        f('a','b','c');
                        f(1);
                        f(2,1);
                        f(0.1);
                        f(
                 }
          }
           
          結果:
          first a b c
          second 1
          second 2 1
          forth 0.1
          third 0
           
          但下面的情況是不允許的,即某個方法中增加一個非可變參數。
           
          OverloadingVarargs2.java
          package sample;
           
          public class OverloadingVarargs2 {
                 static void f(float i,Character...args){
                        System.out.println("first");
                 }
           
                 static void f(Character...args){
                        System.out.println("second");
                 }
                
                 public static void main(String[] args){
                        f(1,'a');
                        f('a','b');//Error
                 }
          }
           
          但可以這樣解決問題。
          package sample;
           
          public class OverloadingVarargs2 {
                 static void f(float i,Character...args){
                        System.out.println("first");
                 }
           
                 static void f(char c,Character...args){
                        System.out.println("second");
                 }
                
                 public static void main(String[] args){
                        f(1,'a');
                        f('a','b');
                 }
          }
          即重載的方法必須保持一致的參數形式。

          posted on 2007-08-19 05:03 前方的路 閱讀(6788) 評論(0)  編輯  收藏 所屬分類: Java技術
          主站蜘蛛池模板: 巧家县| 简阳市| 黄石市| 齐河县| 福安市| 桃源县| 沙坪坝区| 闻喜县| 巴林左旗| 措勤县| 新竹市| 洛隆县| 平谷区| 南投市| 黄浦区| 荆州市| 济源市| 滨海县| 芦溪县| 莲花县| 塔城市| 泽州县| 四川省| 德格县| 铁力市| 吴桥县| 泸定县| 和平区| 从化市| 杭锦旗| 武定县| 莒南县| 宝坻区| 永吉县| 徐闻县| 德保县| 基隆市| 永登县| 库尔勒市| 巨鹿县| 武安市|