自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試突擊:方法優(yōu)先調(diào)用可選參數(shù)還是固定參數(shù)?

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

作者:磊哥

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

轉(zhuǎn)載請聯(lián)系授權(quán)(微信ID:GG_Stone)

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

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

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

可選參數(shù)基本用法如下:

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

以上程序的執(zhí)行結(jié)果如下圖所示:

固定參數(shù)

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

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

可選參數(shù)注意事項(xiàng)

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

1.可選參數(shù)是從0到無窮

可選參數(shù)的調(diào)用個數(shù)是從 0 到無窮,而不是從 1 到無窮,這點(diǎn)需要注意一下,如以下代碼所示:

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

以上程序的執(zhí)行結(jié)果如下圖所示:

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

2.一個方法只能有一個可選參數(shù)

一個方法中只能有一個可選參數(shù),如果有多個可選參數(shù)程序會報(bào)錯,如下圖所示:

3.可選參數(shù)必須要放在方法最后

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

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

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

優(yōu)先調(diào)用固定參數(shù)還是可選參數(shù)?

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

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

以上程序的執(zhí)行結(jié)果如下:

結(jié)論

從上面的結(jié)果可以看出,當(dāng)程序中有固定參數(shù)和可選參數(shù)時,優(yōu)先調(diào)用固定參數(shù),而非可選參數(shù)。

原因分析

看到這,可能有朋友已經(jīng)意識到了,如果你看過我上一篇《為什么不同返回類型不算方法重載?》就全明白了,究竟是先調(diào)用可選參數(shù)還是固定參數(shù)?上一篇文章在介紹方法重載調(diào)用的優(yōu)先級規(guī)則里已經(jīng)說過了:其中可選參數(shù)的調(diào)用優(yōu)先級是最低的,在固定參數(shù)和可選參數(shù)之間還有其他的調(diào)用選項(xiàng)。因?yàn)橛行┡笥褯]注意到,或者沒看到,所以我這里再簡單的回顧一下。

第1優(yōu)先級:精準(zhǔn)參數(shù)匹配

方法重載會優(yōu)先調(diào)用和方法參數(shù)類型一模一樣的固定參數(shù)方法。

第2優(yōu)先級:調(diào)用基本類型自動轉(zhuǎn)換成更大的基本類型

如果是基本數(shù)據(jù)類型,那么方法重載調(diào)用的第 2 匹配原則是自動轉(zhuǎn)換成更大的基本數(shù)據(jù)類型,如以下代碼:

  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("調(diào)用 long 方法"); 
  9.     } 
  10.  
  11.     public void method(Integer num) { 
  12.         System.out.println("調(diào)用 Integer 方法"); 
  13.     } 
  14.  
  15.     public void method(Object num) {  
  16.         System.out.println("調(diào)用 Object 方法"); 
  17.     } 
  18.  
  19.     public void method(int... num) { // 可選參數(shù) 
  20.         System.out.println("調(diào)用 int... 方法"); 
  21.     } 

以上程序的執(zhí)行結(jié)果如下圖所示:

第3優(yōu)先級:自動裝/拆箱匹配

如果存在基本類型對應(yīng)的包裝類型,或者是包裝類型對應(yīng)的基本類型的方法重載,那么會優(yōu)先調(diào)用自動裝箱或自動拆箱的方法重載,如以下代碼所示:

  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("調(diào)用 Integer 方法"); 
  9.     } 
  10.  
  11.     public void method(Object num) { 
  12.         System.out.println("調(diào)用 Object 方法"); 
  13.     } 
  14.  
  15.     public void method(int... num) { // 可選參數(shù) 
  16.         System.out.println("調(diào)用 int... 方法"); 
  17.     } 

以上程序的執(zhí)行結(jié)果如下圖所示:

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

當(dāng)有父類參數(shù)時會優(yōu)先調(diào)用父類重載方法,如下代碼所示:

  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("調(diào)用 Object 方法"); 
  9.     } 
  10.  
  11.     public void method(int... num) { // 可選參數(shù) 
  12.         System.out.println("調(diào)用 int... 方法"); 
  13.     } 

以上程序的執(zhí)行結(jié)果如下圖所示:

第5優(yōu)先級:可選參數(shù)匹配

可選參數(shù)的調(diào)用優(yōu)先級是最低的,當(dāng)一個類中只有可選參數(shù)方法時,才會調(diào)用可選參數(shù)方法。

總結(jié)

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

 

責(zé)任編輯:姜華 來源: Java面試真題解析
相關(guān)推薦

2010-01-19 13:36:16

VB.NET可選參數(shù)

2009-12-17 16:16:24

Rails方法send

2009-10-28 13:23:52

VB.NET可選參數(shù)

2022-02-15 07:03:04

start 源碼run線程

2010-01-12 11:47:09

VB.NET可選參數(shù)

2022-04-18 07:36:37

TimeUnit線程休眠

2022-03-09 07:35:24

線程池線程參數(shù)

2009-03-10 13:51:36

編譯器VS2010C#

2024-01-17 06:23:35

SwiftTypeScript定義函數(shù)

2022-01-11 06:53:23

面試重寫重載

2009-08-13 09:47:57

調(diào)用JSP EL表達(dá)式帶參數(shù)方法

2009-05-26 16:12:43

Visual StudC#命名

2010-09-25 13:13:17

tomcatJVM

2021-10-04 14:56:09

機(jī)器學(xué)習(xí)函數(shù)參數(shù)

2022-08-17 07:06:14

SpringBoot配置@Value

2022-07-11 07:10:48

HTTP協(xié)議類型

2022-04-11 07:40:45

synchroniz靜態(tài)方法程序

2022-02-28 07:01:22

線程中斷interrupt

2009-08-05 09:09:14

C#調(diào)用VC DLL接

2022-05-05 07:38:32

volatilJava并發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號