成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試突擊:方法優先調用可選參數還是固定參數?

開發 前端
可選參數是 JDK 5 中新增的以“...”格式存在的參數類型,可選參數可以匹配 0 到無窮個參數,但一個方法中只能有一個可選參數,且可選參數要放在方法參數的最后面。

作者:磊哥

來源 | Java面試真題解析(ID:aimianshi666)

轉載請聯系授權(微信ID:GG_Stone)

面試合集:https://gitee.com/mydb/interview

可選參數(varargs)是 JDK 5 中新增的特性,也叫變長參數或可變參數。它是指一個方法的參數中可以用“...”來表示此方法可以接受無窮個參數,這種表示方法就叫可選參數。可選參數的語法如下:

  1. public void method(數據類型... 參數名稱){ 
  2.     // 方法體 

可選參數基本用法如下:

  1. public class ArgumentExample { 
  2.     public static void main(String[] args) { 
  3.         // 調用可選參數 
  4.         method("Java"); 
  5.         System.out.println(); 
  6.         // 調用可選參數 
  7.         method("MySQL""Redis"); 
  8.         // 調用可選參數 
  9.         System.out.println(); 
  10.         method("Spring""Spring MVC""Spring Boot"); 
  11.     } 
  12.     /** 
  13.      * 可選參數方法 
  14.      */ 
  15.     public static void method(String... names) { 
  16.         for (String item : names) { 
  17.             System.out.println(item); 
  18.         } 
  19.     } 

以上程序的執行結果如下圖所示:

固定參數

固定參數的概念恰好與可選參數相反,固定參數也就是普通的參數,一個方法中有固定的參數類型和個數且沒有“...”修飾就是固定參數。JDK 5 之前所有的方法傳參都是固定參數,如下代碼所示:

  1. public class ArgumentExample { 
  2.     public static void main(String[] args) { 
  3.         method("Java"); 
  4.     } 
  5.     /** 
  6.      * 固定參數方法 
  7.      */ 
  8.     public static void method(String name) { 
  9.         System.out.println("固定參數:" + name); 
  10.     } 

可選參數注意事項

可選參數在使用時要注意以下 4 個問題。

1.可選參數是從0到無窮

可選參數的調用個數是從 0 到無窮,而不是從 1 到無窮,這點需要注意一下,如以下代碼所示:

  1. public class ArgumentExample { 
  2.     public static void main(String[] args) { 
  3.         method(); 
  4.     } 
  5.     /** 
  6.      * 可選參數方法 
  7.      */ 
  8.     public static void method(String... names) { 
  9.         System.out.println("可選參數數量:" + names.length); 
  10.     } 

以上程序的執行結果如下圖所示:

從上述代碼可以看出,可選參數即使不傳遞任何參數,也就是 0 個參數,也是能正常調用到的。

2.一個方法只能有一個可選參數

一個方法中只能有一個可選參數,如果有多個可選參數程序會報錯,如下圖所示:

3.可選參數必須要放在方法最后

可選參數如果不放在方法參數的最后面,那么編譯器也會報錯,如下圖所示:

4.可選參數和其他同名方法組成方法重載

可選參數和其他的同名方法可以并存,并且它們組成了方法重載,如下代碼所示:

優先調用固定參數還是可選參數?

基本知識點介紹完,接下來咱們回到本文的主題,當一個方法中有兩類參數:固定參數和可選參數時,究竟是先調用固定參數呢?還是先調用可選參數呢?接下來咱們使用一段代碼來測試一下:

  1. public class ArgumentExample { 
  2.     public static void main(String[] args) { 
  3.         method("磊哥聊編程"); 
  4.     } 
  5.     /** 
  6.      * 固定參數方法 
  7.      */ 
  8.     public static void method(String name) { 
  9.         System.out.println("調用固定參數:" + name); 
  10.     } 
  11.     /** 
  12.      * 可選參數方法 
  13.      */ 
  14.     public static void method(String... names) { 
  15.         System.out.println("調用可選參數:" + names.length); 
  16.     } 

以上程序的執行結果如下:

結論

從上面的結果可以看出,當程序中有固定參數和可選參數時,優先調用固定參數,而非可選參數。

原因分析

看到這,可能有朋友已經意識到了,如果你看過我上一篇《為什么不同返回類型不算方法重載?》就全明白了,究竟是先調用可選參數還是固定參數?上一篇文章在介紹方法重載調用的優先級規則里已經說過了:其中可選參數的調用優先級是最低的,在固定參數和可選參數之間還有其他的調用選項。因為有些朋友沒注意到,或者沒看到,所以我這里再簡單的回顧一下。

第1優先級:精準參數匹配

方法重載會優先調用和方法參數類型一模一樣的固定參數方法。

第2優先級:調用基本類型自動轉換成更大的基本類型

如果是基本數據類型,那么方法重載調用的第 2 匹配原則是自動轉換成更大的基本數據類型,如以下代碼:

  1. public class OverloadExample { 
  2.     public static void main(String[] args) { 
  3.         OverloadExample example = new OverloadExample(); 
  4.         example.method(12); 
  5.     } 
  6.  
  7.     public void method(long num) { 
  8.         System.out.println("調用 long 方法"); 
  9.     } 
  10.  
  11.     public void method(Integer num) { 
  12.         System.out.println("調用 Integer 方法"); 
  13.     } 
  14.  
  15.     public void method(Object num) {  
  16.         System.out.println("調用 Object 方法"); 
  17.     } 
  18.  
  19.     public void method(int... num) { // 可選參數 
  20.         System.out.println("調用 int... 方法"); 
  21.     } 

以上程序的執行結果如下圖所示:

第3優先級:自動裝/拆箱匹配

如果存在基本類型對應的包裝類型,或者是包裝類型對應的基本類型的方法重載,那么會優先調用自動裝箱或自動拆箱的方法重載,如以下代碼所示:

  1. public class OverloadExample { 
  2.     public static void main(String[] args) { 
  3.         OverloadExample example = new OverloadExample(); 
  4.         example.method(12); 
  5.     } 
  6.  
  7.     public void method(Integer num) { 
  8.         System.out.println("調用 Integer 方法"); 
  9.     } 
  10.  
  11.     public void method(Object num) { 
  12.         System.out.println("調用 Object 方法"); 
  13.     } 
  14.  
  15.     public void method(int... num) { // 可選參數 
  16.         System.out.println("調用 int... 方法"); 
  17.     } 

以上程序的執行結果如下圖所示:

第4優先級:按照繼承路線依次向上匹配父類

當有父類參數時會優先調用父類重載方法,如下代碼所示:

  1. public class OverloadExample { 
  2.     public static void main(String[] args) { 
  3.         OverloadExample example = new OverloadExample(); 
  4.         example.method(12); 
  5.     } 
  6.  
  7.     public void method(Object num) { 
  8.         System.out.println("調用 Object 方法"); 
  9.     } 
  10.  
  11.     public void method(int... num) { // 可選參數 
  12.         System.out.println("調用 int... 方法"); 
  13.     } 

以上程序的執行結果如下圖所示:

第5優先級:可選參數匹配

可選參數的調用優先級是最低的,當一個類中只有可選參數方法時,才會調用可選參數方法。

總結

可選參數是 JDK 5 中新增的以“...”格式存在的參數類型,可選參數可以匹配 0 到無窮個參數,但一個方法中只能有一個可選參數,且可選參數要放在方法參數的最后面。它可以和固定參數組成方法重載,但可選參數的調用優先級是最低的。

 

責任編輯:姜華 來源: Java面試真題解析
相關推薦

2010-01-19 13:36:16

VB.NET可選參數

2009-12-17 16:16:24

Rails方法send

2009-10-28 13:23:52

VB.NET可選參數

2022-02-15 07:03:04

start 源碼run線程

2022-04-18 07:36:37

TimeUnit線程休眠

2010-01-12 11:47:09

VB.NET可選參數

2022-03-09 07:35:24

線程池線程參數

2009-03-10 13:51:36

編譯器VS2010C#

2022-01-11 06:53:23

面試重寫重載

2024-01-17 06:23:35

SwiftTypeScript定義函數

2009-08-13 09:47:57

調用JSP EL表達式帶參數方法

2009-05-26 16:12:43

Visual StudC#命名

2010-09-25 13:13:17

tomcatJVM

2022-02-28 07:01:22

線程中斷interrupt

2022-04-11 07:40:45

synchroniz靜態方法程序

2022-07-11 07:10:48

HTTP協議類型

2022-08-17 07:06:14

SpringBoot配置@Value

2021-10-04 14:56:09

機器學習函數參數

2022-05-05 07:38:32

volatilJava并發

2022-06-06 07:35:26

MySQLInnoDBMyISAM
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 狠狠爱综合| 欧美日韩在线视频一区二区 | 欧美一级黄 | 在线不卡视频 | 欧美网站一区 | 中文字幕在线观看精品 | 在线国产小视频 | 四色永久 | 91麻豆精品国产91久久久久久 | 久久久久久久久久久久久久国产 | 午夜av电影 | 日韩欧美专区 | 人妖一区 | 午夜亚洲 | 伊人免费网 | 97视频精品 | 一级特黄网站 | 91久久精品国产 | 国产精品成人一区二区 | 精品小视频 | 国产黑丝av| 日韩中文av在线 | 亚洲一区视频在线 | 精品国产一区二区三区日日嗨 | 国产精品美女www爽爽爽视频 | 国产日韩欧美在线 | 国产精品久久久久久久久免费 | 欧美电影在线 | 亚洲欧美日韩激情 | 日本成年免费网站 | 久久成人免费视频 | 欧美久久久久久久 | 精品视频在线免费观看 | 九九九视频在线观看 | 无码日韩精品一区二区免费 | 国产精品久久久久久久久久免费看 | 中文字幕成人av | 91精品国产91久久久久游泳池 | 日韩有码在线播放 | 精品日韩一区 | 色婷婷亚洲一区二区三区 |