中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java數組傳遞及可變參數操作實例詳解

發布時間:2020-09-18 10:42:46 來源:腳本之家 閱讀:330 作者:下班后的爪哇菌 欄目:編程語言

本文實例講述了Java數組傳遞及可變參數操作。分享給大家供大家參考,具體如下:

方法可以操作傳遞和返回基本數據類型,但是方法中也可用來傳遞和返回數組。如果要向方法中傳遞一個數組,則方法的接收參數處必須是符合其類型的數組。而且數組屬于引用數據類型,所以在把數組傳遞進方法之后,如果方法對數組本身做了任何修改,修改結果都是會保存下來的。

向方法中傳遞數組

在java中,所有對象都是通過引用進行操作的。而數組也是一種對象,當把數組作為參數傳遞給方法時,傳遞的實際上就是數組對象的引用。在方法中對數組的所有操作,都會映射到原數組中。而所謂的"引用",就是java對象在堆內存的地址賦給了多個"棧內存"的變量。

public class Test {
  public static void main(String[] args) {
    int[] array = { 1, 3, 5 }; // 使用靜態初始化定義數組
    method(array); // 傳遞數組引用
    for (int i = 0; i < array.length; i++) { // 循環輸出
      System.out.print(array[i] + "\t");
    }
  }
  public static void method(int[] x) { // 接收整型數組引用
    x[0] = 6; // 修改第一個元素的內容
  }
}

執行結果:

6	3	5	

我們來看一下其執行時的內存狀態:

Java數組傳遞及可變參數操作實例詳解

使用方法返回一個數組

既然方法可以接收一個數組,那么方法也就可以返回一個數組,則此時,只需要在返回值類型聲明處明確的寫出返回的數組類型即可。

public class Test {
  public static void main(String[] args) {
    int[] array = method(); // 通過方法實例化數組
    print(array); // 向print()方法中傳遞數組
  }
  public static void print(int x[]) { // 接收數組
    for (int i = 0; i < x.length; i++) { // 循環輸出
      System.out.print(x[i] + "");
    }
  }
  public static int[] method() { // 此方法返回一個數組引用
    int ss[] = { 1, 3, 5, 7, 9 }; // 定義一個數組
    return ss; // 返回數組
  }
}

執行結果:

1 3 5 7 9 

可變參數(JDK 1.5)

JDK 1.5 開始,Java支持傳遞同類型的可變參數給一個方法。一個方法中只能指定一個可變參數,它必須是方法的最后一個參數。任何普通的參數必須在它之前聲明。

聲明方式:

返回值類型 方法名稱(類型…參數名稱){ // 在方法聲明中,在指定參數類型后加一個省略號(...) 
  // 方法體
}

可變參數方法的使用與方法參數部分使用數組是一致的,例如可以循環輸出所有的參數值。

public static void print(String...names) { // 接收數組
  for(String name : names) {
    System.out.print(name + " "); 
  }
  System.out.println();
}

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

public static void main(String[] args) {
  String[] names = {"jerry", "tom", "rose"};
  print(); // 不傳遞參數
  print("jerry", "tom"); // 傳遞多個參數
  print(names); // 傳遞數組
}

從以上代碼可知,調用使用了可變參數的方法時:

1)可以不寫參數,即傳入空參;

2)可以直接在里邊寫入參數,參數間用逗號隔開;

3)可以傳入一個數組;

可變參數的使用規則

1) 擁有可變參數的方法可以被重載,在調用方法的時候,如果能夠和固定參數的方法匹配,也能夠與可變長參數的方法匹配,則選擇固定參數的方法。

public class Test {
  public static void main(String[] args) {
    print();
    print("jerry");
    print("jerry", "tom");
  }
  public static void print(String...names) { // 接收數組
    System.out.print("可變參數方法: ");
    for(String name : names) {
      System.out.print(name + " "); 
    }
    System.out.print("\n");
  }
  public static void print(String name) { // 接收一個String類型參數
    System.out.println("固定參數方法: " + name);
  }
}

執行結果如下:

可變參數方法: 
固定參數方法: jerry
可變參數方法: jerry tom 

2)如果要調用的方法可以和兩個可變參數匹配,則出現錯誤。

public class Test {
  public static void main(String[] args) {
    print();
    print("jerry"); // 編譯錯誤
    print("jerry", "tom"); // 編譯錯誤
  }
  public static void print(String...names) {
    System.out.println("------1------");
  }
  public static void print(String name, String...names) { 
    System.out.println("------2------ ");
  }
}

main方法中的兩個傳參的調用都不能編譯通過,因為編譯器不知道該選哪個方法調用,如下所示:

Java數組傳遞及可變參數操作實例詳解

3)一個方法只能有一個可變長參數,并且這個可變長參數必須是該方法的最后一個參數

public class Test {
  public static void print(String name, String...names) {
    System.out.println("------1------");
  }
  public static void print(int[] Ids, String...names) { 
    System.out.println("------2------ ");
  }
}

以下的方法定義都是錯誤的:

Java數組傳遞及可變參數操作實例詳解

4)可變參數可以兼容數組參數,但數組參數無法兼容可變參數。

public class Test {
  public static void main(String[] args) {
  }
  public void print(String... names){
    System.out.println("-----1-----");
  } 
  public void print(String[] names){ 
    System.out.println("-----2-----");
  }
}

當試圖使用數組作為參數去實現重載時,會報錯,說明可變參數與數組沖突(兩者應該是一方能兼容另一方)。

Java數組傳遞及可變參數操作實例詳解

public class Test {
  public static void main(String[] args) {
    Test test = new Test();
    test.print("jerry","tom");
  }
  public void print(String[] namse){ 
    System.out.println("----------");
  }
}

如果定義一個參數為數組的方法,像調用可變參數的方法一樣調用它是會報錯,說明可變參數并不是一個數組。

Java數組傳遞及可變參數操作實例詳解

 

可變長參數的使用規范

1) 避免帶有可變長參數的方法重載

例如上面使用規則的第一個例子,編譯器雖然知道怎么調用,但人容易陷入調用的陷阱及誤區。

2) 別讓null值和空值威脅到變長方法

public class Test {
  public static void main(String[] args) {
    print("人事部");
    print("jerry", null);
  }
  public static void print(String dept, Integer...Ids) {
  }
  public static void print(String name, String...names ){
  }
}

以上main方法里的兩個調用編譯都不通過:

Java數組傳遞及可變參數操作實例詳解

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

public static void main(String[] args) {
  String[] names = null;
  print("jerry", names);
}

3)重寫(覆寫)可變參數方法也要循規蹈矩

public class Test {
  public static void main(String[] args) {
    // 向上轉型
    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");
  }
}

以上main方法中第二個調用編譯不通過:

Java數組傳遞及可變參數操作實例詳解

第一個能編譯通過,這是為什么呢?事實上,base對象把子類對象sub做了向上轉型,形參列表是由父類決定的,當然能通過。再看看子類直接調用的情況,這時編譯器看到子類覆寫了父類的print方法,因此肯定使用子類重新定義的print方法,盡管參數列表不匹配也不會跑到父類再去匹配下,因為找到了就不再找了,因此有了類型不匹配的錯誤。

這是個特例,重寫的方法參數列表與父類不相同,這違背了重寫的定義,并且會引發莫名其妙的錯誤。在這里,我們再復習下重寫必須滿足的條件:

1)重寫方法不能縮小訪問權限;

2)參數列表必須與被重寫方法相同(包括顯示形式);

3)返回類型必須與被重寫方法的相同或是其子類;

4)重寫方法不能拋出新的異常,或者超過了父類范圍的異常,但是可以拋出更少、更有限的異常,或者不拋出異常。

最后,我們看下面一個有陷阱的例子:

public class Test {
  public static void main(String[] args) {
    print("");
    print("jerry");
    print("jerry", "tom");
  }
  public static void print(String name, String... names) {
    for (int i = 0; i < names.length; i++) {
      System.out.println(names[i]);
    }
  }
}

以上代碼是能夠正常編譯執行的,它的執行結果如下:

tom

更多java相關內容感興趣的讀者可查看本站專題:《Java面向對象程序設計入門與進階教程》、《Java數據結構與算法教程》、《Java操作DOM節點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》

希望本文所述對大家java程序設計有所幫助。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

中山市| 沅江市| 太谷县| 咸阳市| 古丈县| 通榆县| 岚皋县| 锦州市| 贵德县| 玉龙| 义乌市| 万盛区| 平江县| 凤庆县| 石景山区| 南靖县| 通州市| 定州市| 柯坪县| 镇巴县| 寻乌县| 吉林市| 岳普湖县| 温泉县| 高青县| 山阴县| 望谟县| 宁都县| 祥云县| 靖宇县| 德庆县| 海兴县| 郓城县| 托里县| 五原县| 博罗县| 琼中| 珲春市| 临桂县| 宜兰县| 温宿县|