Java中可變長參數方法的定義和使用__Java

來源:互聯網
上載者:User

java中可變長參數的使用方法


在Java5 中提供了變長參數(varargs),也就是在方法定義中可以使用個數不確定的參數,對於同一方法可以使用不同個數的參數調用,例如print("hello");print("hello","lisi");print("hello","張三", "alexia");下面介紹如何定義可變長參數 以及如何使用可變長參數。

1. 可變長參數的定義

使用...表示可變長參數,例如

print(String... args){

   ...

}

在具有可變長參數的方法中可以把參數當成數組使用,例如可以迴圈輸出所有的參數值。

print(String... args){

   for(String temp:args)

      System.out.println(temp);

}

2. 可變長參數的方法的調用

調用的時候可以給出任意多個參數也可不給參數,例如:

print();

print("hello");

print("hello","lisi");

print("hello","張三", "alexia")

3. 可變長參數的使用規則

3.1 在調用方法的時候,如果能夠和固定參數的方法匹配,也能夠與可變長參數的方法匹配,則選擇固定參數的方法。看下面代碼的輸出:

package com;// 這裡使用了靜態匯入import static java.lang.System.out;public class VarArgsTest {    public void print(String... args) {        for (int i = 0; i < args.length; i++) {            out.println(args[i]);        }    }    public void print(String test) {        out.println("----------");    }    public static void main(String[] args) {        VarArgsTest test = new VarArgsTest();        test.print("hello");        test.print("hello", "alexia");    }}



3.2 如果要調用的方法可以和兩個可變參數匹配,則出現錯誤,例如下面的代碼:

package com;// 這裡使用了靜態匯入import static java.lang.System.out;public class VarArgsTest1 {    public void print(String... args) {        for (int i = 0; i < args.length; i++) {            out.println(args[i]);        }    }    public void print(String test,String...args ){          out.println("----------");    }    public static void main(String[] args) {        VarArgsTest1 test = new VarArgsTest1();        test.print("hello");        test.print("hello", "alexia");    }}

對於上面的代碼,main方法中的兩個調用都不能編譯通過,因為編譯器不知道該選哪個方法調用,如下所示:



3.3 一個方法只能有一個可變長參數,並且這個可變長參數必須是該方法的最後一個參數

以下兩種方法定義都是錯誤的。

 public void test(String... strings,ArrayList list){
  
 }
 
 public void test(String... strings,ArrayList... list){
  
 }

4. 可變長參數的使用規範

4.1 避免帶有可變長參數的方法重載:如3.1中,編譯器雖然知道怎麼調用,但人容易陷入調用的陷阱及誤區

4.2 別讓null值和空值威脅到變長方法,如3.2中所示,為了說明null值的調用,重新給出一個例子:

package com;public class VarArgsTest1 {    public void print(String test, Integer... is) {            }    public void print(String test,String...args ){              }    public static void main(String[] args) {        VarArgsTest1 test = new VarArgsTest1();        test.print("hello");        test.print("hello", null);    }}

這時會發現兩個調用編譯都不通過:


因為兩個方法都匹配,編譯器不知道選哪個,於是報錯了,這裡同時還有個非常不好的編碼習慣,即調用者隱藏了實參類型,這是非常危險的,不僅僅調用者需要“猜測”該調用哪個方法,而且被調用者也可能產生內部邏輯混亂的情況。對於本例來說應該做如下修改:

    public static void main(String[] args) {        VarArgsTest1 test = new VarArgsTest1();        String[] strs = null;        test.print("hello", strs);    }

4.3 覆寫變長方法也要循規蹈矩

下面看一個例子,大家猜測下程式能不能編譯通過:

package com;public class VarArgsTest2 {    /**     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub        // 向上轉型        Base base = new Sub();        base.print("hello");                // 不轉型        Sub sub = new Sub();        sub.print("hello");    }}// 基類class Base {    void print(String... args) {        System.out.println("Base......test");    }}// 子類,覆寫父類方法class Sub extends Base {    @Override    void print(String[] args) {        System.out.println("Sub......test");    }}

答案當然是編譯不通過,是不是覺得很奇怪。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.