鍍金池/ 教程/ Java/ Java可變長度參數(shù)
Java參數(shù)傳遞
Java靜態(tài)內(nèi)部類
Java final關(guān)鍵字
http://www.yiibai.com/java_object_oriented_design/java_inheritan
Java泛型類
Java標(biāo)準(zhǔn)注解
Java接口教程
Java注解
Java枚舉類型
http://www.yiibai.com/java_object_oriented_design/java_class_ins
Java接口實現(xiàn)
Java哈希編碼
Java泛型約束
http://www.yiibai.com/java_object_oriented_design/java_import.ht
Java注解默認(rèn)值
Java異常拋出
Java不可變對象
Java類基礎(chǔ)
Java接口繼承
Java類方法
Java訪問級別
Java對象克隆
Java初始化塊
Java可變長度參數(shù)
Java接口字段
Java對象相等比較(Equals)
Java實例和靜態(tài)方法
Java繼承方法隱藏(覆蓋)
Java面向?qū)ο笤O(shè)計
Java對象finalize()方法
Java抽象類和方法
Java Object類
Java泛型方法和構(gòu)造函數(shù)
Java枚舉體
Java接口方法
Java this關(guān)鍵字
Java注解類型的限制
Java main()方法
Java Enum類
Java注解用法
Java枚舉比較
Java注解類型
Java內(nèi)部類成員
Java繼承和構(gòu)造函數(shù)
Java類實例化
Java內(nèi)部類類型
Java對象toString()方法
Java finally塊
Java繼承教程
Java自定義異常
Java枚舉值
Java接口作為類型
Java異常類
Java方法覆蓋教程
http://www.yiibai.com/java_object_oriented_design/java_class_bas
Java枚舉方法
Java方法重載
http://www.yiibai.com/java_object_oriented_design/java_interface
Java異常用法
Java內(nèi)部類
Java類成員訪問級別
Java異常處理教程
Java注解反射
Java構(gòu)造函數(shù)(構(gòu)造器)
Java導(dǎo)入(import語句的用法)

Java可變長度參數(shù)

術(shù)語“varargs”是”variable-length arguments”(可變長度參數(shù))的縮寫。
可變長度參數(shù)聲明一個接受可變數(shù)量的參數(shù)(或參數(shù))的方法或構(gòu)造函數(shù)。

聲明可變長度參數(shù)方法

要聲明可變長度參數(shù),在方法參數(shù)的數(shù)據(jù)類型之后添加一個省略號...。下面的代碼顯示了一個帶有一個可變長度參數(shù)nummax()方法聲明,它是int數(shù)據(jù)類型。

public static  int max(int... num) {

}

省略號...之前和之后添加空格是可選的。可變長度參數(shù)方法可以有多個參數(shù)。 下面的代碼顯示aMethod()接受三個參數(shù),其中一個是可變長度參數(shù):

public static int aMethod(String str, double   d1,   int...num)  {

}

方法最多可以有一個可變長度參數(shù)??勺冮L度參數(shù)方法的可變長度參數(shù)必須是參數(shù)列表中的最后一個參數(shù)。

void  m2(String str, int...n1) {

}

示例

重寫上面的 max()方法,使其成為可變長度參數(shù)方法:

public class Main {
  public static int max(int... num) {
    int max = Integer.MIN_VALUE;
    for (int i = 0; i < num.length; i++) {
      if (num[i] > max) {
        max = num[i];
      }
    }
    return max;
  }
}

使用可變長度參數(shù)方法

可以使用for循環(huán)來處理可變長度參數(shù)的參數(shù)列表。length屬性給出了可變長度參數(shù)傳遞的值的數(shù)量。

要獲取可變長度參數(shù)中的第n個值,需要使用varArgsName [n-1]。可以使用foreach循環(huán)來處理可變長度參數(shù)。

public class Main {
  // 求參數(shù)列表中的最大值...
  public static int max2(int... num) {
    int max = Integer.MIN_VALUE;
    for (int currentNumber : num) {
      if (currentNumber > max) {
        max = currentNumber;
      }
    }
    return max;
  }
}

可以調(diào)用Main.max()方法如下:

int max1 = Main.max(1, 8);
int max2 = Main.max(1, 1, 3);

對于方法中的可變長度參數(shù),可以使用零個或多個參數(shù)。 以下代碼是對max()方法的有效調(diào)用:

int max = Main.max(); // Passing no  argument  is ok

max()方法的以下聲明將強(qiáng)制其調(diào)用者至少傳遞兩個整數(shù):

// Argumenets  n1  and  n2  are   mandatory
public static int max(int n1,  int n2,   int... num) {

}

編譯器會將前兩個參數(shù)n1n2視為強(qiáng)制性參數(shù),將第三個參數(shù)num作為可選參數(shù)。

public class Main {
  public static int max(int n1, int n2, int... num) {
    // Initialize max to the maximum of n1 and n2
    int max = (n1 > n2 ? n1 : n2);

    for (int i = 0; i < num.length; i++) {
      if (num[i] > max) {
        max = num[i];
      }
    }
    return max;
  }

  public static void main(String[] args) {
    System.out.println(max(77, 99));
    System.out.println(max(77, 99, 1010));
    System.out.println(max(77, 99, 1010, 1313));
  }
}

上面的代碼生成以下結(jié)果。

重載可變長度參數(shù)方法

方法重載規(guī)則適用于可變長度參數(shù)方法。可以使用可變長度參數(shù)重載一個方法,只要方法的參數(shù)在類型,順序或數(shù)字上不同。

例如,以下是一個重載的max()方法的有效示例:

public  class  Main {
    public static int max(int x, int  y)  {
    }

    public static int max(int...num)  {
    }
}

考慮下面的代碼 -

int max = Main.max(12, 13);  // which  max()  will be  called?

Java將調(diào)用max(int x,int y)。 Java首先嘗試使用對參數(shù)數(shù)量的精確匹配來找到方法聲明。 如果沒有找到完全匹配,它將使用可變長度參數(shù)查找匹配。
如果可變長度參數(shù)方法重載,Java使用該方法的其它特定版本,而不使用可變長度參數(shù)方法。 java使用可變長度參數(shù)方法作為解決方法調(diào)用的最后手段。
方法本身的重載可能是有效的。 但是,調(diào)用它可能會導(dǎo)致問題。

public class Main {
  public static int max(int... num) {
    return 0;
  }

  public static int max(double... num) {
    return 0;
  }
}

下面的代碼調(diào)用哪個max()方法?

int max = Main.max(); // Which max()  to call?

上面的語句將生成一個編譯時錯誤。

可變長度參數(shù)方法和main()方法

main()方法的簽名必須是main(String [] args)Main類的main()方法的以下聲明是有效的。

public class Main {
  public static void main(String... args) {
    System.out.println("Hello from  varargs main()...");
  }
}