亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java數(shù)組傳遞及可變參數(shù)操作實例詳解

 更新時間:2019年09月06日 11:06:13   作者:下班后的爪哇菌  
這篇文章主要介紹了Java數(shù)組傳遞及可變參數(shù)操作,結(jié)合實例形式詳細(xì)分析了java數(shù)組參數(shù)傳遞與可變參數(shù)相關(guān)使用技巧,需要的朋友可以參考下

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

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

向方法中傳遞數(shù)組

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

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

執(zhí)行結(jié)果:

6	3	5	

我們來看一下其執(zhí)行時的內(nèi)存狀態(tài):

使用方法返回一個數(shù)組

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

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

執(zhí)行結(jié)果:

1 3 5 7 9 

可變參數(shù)(JDK 1.5)

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

聲明方式:

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

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

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

調(diào)用的時候可以給出任意多個參數(shù)也可不給參數(shù),例如:

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

從以上代碼可知,調(diào)用使用了可變參數(shù)的方法時:

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

2)可以直接在里邊寫入?yún)?shù),參數(shù)間用逗號隔開;

3)可以傳入一個數(shù)組;

可變參數(shù)的使用規(guī)則

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

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

執(zhí)行結(jié)果如下:

可變參數(shù)方法: 
固定參數(shù)方法: jerry
可變參數(shù)方法: jerry tom 

2)如果要調(diào)用的方法可以和兩個可變參數(shù)匹配,則出現(xiàn)錯誤。

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方法中的兩個傳參的調(diào)用都不能編譯通過,因為編譯器不知道該選哪個方法調(diào)用,如下所示:

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

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------ ");
  }
}

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

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

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-----");
  }
}

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

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("----------");
  }
}

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

 

可變長參數(shù)的使用規(guī)范

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

例如上面使用規(guī)則的第一個例子,編譯器雖然知道怎么調(diào)用,但人容易陷入調(diào)用的陷阱及誤區(qū)。

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方法里的兩個調(diào)用編譯都不通過:

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

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

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

public class Test {
  public static void main(String[] args) {
    // 向上轉(zhuǎn)型
    Base base = new Sub();
    base.print("hello");
    // 不轉(zhuǎn)型
    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方法中第二個調(diào)用編譯不通過:

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

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

1)重寫方法不能縮小訪問權(quán)限;

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

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]);
    }
  }
}

以上代碼是能夠正常編譯執(zhí)行的,它的執(zhí)行結(jié)果如下:

tom

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計入門與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

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

相關(guān)文章

  • 在Java Web項目中添加定時任務(wù)的方法

    在Java Web項目中添加定時任務(wù)的方法

    在Java Web程序中加入定時任務(wù),這里介紹兩種方式使用監(jiān)聽器注入,使用Spring注解@Scheduled注入,需要的朋友可以參考下
    2018-01-01
  • Json 自定義使用函數(shù)的簡單實例

    Json 自定義使用函數(shù)的簡單實例

    下面小編就為大家?guī)硪黄狫son 自定義使用函數(shù)的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • 利用java制作簡單的音樂播放器

    利用java制作簡單的音樂播放器

    這篇文章主要為大家詳細(xì)介紹了利用java的swing技術(shù)制作簡單的音樂播放器,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • SpringBoot時區(qū)問題解決以及徹底解決時差問題

    SpringBoot時區(qū)問題解決以及徹底解決時差問題

    這篇文章主要給大家介紹了關(guān)于SpringBoot時區(qū)問題解決以及徹底解決時差問題的相關(guān)資料,spring?boot作為微服務(wù)簡易架構(gòu),擁有其自身的特點,快速搭建架構(gòu),簡單快捷,需要的朋友可以參考下
    2023-08-08
  • MyBatis-Plus實現(xiàn)多表聯(lián)查的方法實戰(zhàn)

    MyBatis-Plus實現(xiàn)多表聯(lián)查的方法實戰(zhàn)

    這篇文章主要給大家介紹了關(guān)于MyBatis-Plus實現(xiàn)多表聯(lián)查的方法,MyBatis Plus是一款針對MyBatis框架的增強工具,它提供了很多方便的方法來實現(xiàn)多表聯(lián)查,需要的朋友可以參考下
    2023-07-07
  • java使用tess4j進(jìn)行圖片文字識別功能

    java使用tess4j進(jìn)行圖片文字識別功能

    Tess4J?是Java?(JNA)?對?Tesseract?OCR?API?的封裝,Tess4J是java直接可使用的jar包,而Tesseract?OCR是支持Tess4J進(jìn)文件文字識別的基礎(chǔ),Tess4J可直接使用Maven方式引入,這篇文章主要介紹了java使用tess4j進(jìn)行圖片文字識別,需要的朋友可以參考下
    2023-04-04
  • Java虛擬機JVM棧溢出的問題解決

    Java虛擬機JVM棧溢出的問題解決

    Java虛擬機棧溢出是指在Java程序中,當(dāng)線程調(diào)用的方法層級過深,導(dǎo)致??臻g溢出的情況,本文就詳細(xì)的介紹了下產(chǎn)生的原因以及優(yōu)化,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • Java String類用法詳解

    Java String類用法詳解

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著Java String類用法展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • SpringBoot集成jersey打包jar找不到class的處理方法

    SpringBoot集成jersey打包jar找不到class的處理方法

    這篇文章主要介紹了SpringBoot集成jersey打包jar找不到class的處理方法,文中通過代碼示例介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-03-03
  • Java學(xué)習(xí)-打印1-1000以內(nèi)的水仙花數(shù)代碼實例

    Java學(xué)習(xí)-打印1-1000以內(nèi)的水仙花數(shù)代碼實例

    這篇文章主要介紹了Java打印1-1000以內(nèi)的水仙花數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評論