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

面試系列:為什么不同返回類型不算方法重載?

開發 前端
方法重載是指在同一個類中,定義了多個同名方法,但每個方法的參數類型或者是參數個數不同就是方法重載。

作者:磊哥

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

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

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

方法重載是指在同一個類中,定義了多個同名方法,但每個方法的參數類型或者是參數個數不同就是方法重載。比如以下 4 個 method 方法就可以稱之為方法重載,如下代碼所示:

  1. public class OverloadExample { 
  2.     public void method() { 
  3.         // doSomething 
  4.     } 
  5.  
  6.     public void method(String name) { 
  7.         // doSomething 
  8.     } 
  9.  
  10.     public void method(Integer id) { 
  11.         // doSomething 
  12.     } 
  13.  
  14.     public void method(Integer id, String name) { 
  15.         // doSomething 
  16.     } 

為什么不同返回類型不算方法重載?

要回答這個問題,首先要了解一點前置內容,方法簽名。方法簽名是由:方法名稱 + 參數類型 + 參數個數組成的一個唯一值,這個唯一值就是方法簽名,而 JVM(Java 虛擬機)就是通過這個方法簽名來決定調用哪個方法的。從方法簽名的組成規則我們可以看出,方法的返回類型不是方法簽名的組成部分,所以當同一個類中出現了多個方法名和參數相同,但返回值類型不同的方法時,JVM 就沒辦法通過方法簽名來判斷到底要調用哪個方法了,如下圖所示:

那為什么返回類型不能做為方法簽名的一部分呢?原因其實很簡單,試想一下,如果方法的返回類型也作為方法簽名的一部分,那么當程序員寫了一個代碼去調用“重載”的方法時,JVM 就不能分辨要調用哪個方法了,如下代碼所示:

  1. public class OverloadExample { 
  2.     public static void main(String[] args) { 
  3.         OverloadExample example = new OverloadExample(); 
  4.         example.method("磊哥"); // JVM 應該調用哪個方法? 
  5.     } 
  6.  
  7.     public int method(String name) { 
  8.         // doSomething 
  9.         return 666; 
  10.     } 
  11.  
  12.     public String method(String name) { 
  13.         // doSomething 
  14.         return "磊哥聊編程"
  15.     } 

像以上情況,JVM 就推斷不出來要調用哪個方法了,所以方法的返回類型不能作為方法簽名的一部分。

方法重載的使用場景

方法重載的經典使用場景是 String 類型的 valueOf 方法,valueOf 方法重載有 9 種實現,如下圖所示:

它可以將數組、對象和基礎數據類型轉換成字符串類型。

方法重載匹配原則

方法重載的調用順序是有前后之分的,比如以下代碼:

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

當出現方法重載時,程序要調用哪個方法呢?執行以上程序的執行結果如下:

因此我們可以得出以下結論。

匹配原則1:精準類型匹配

方法重載會優先調用和方法參數類型一模一樣的方法,這是第一優先匹配原則:精準類型匹配。

匹配原則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:自動裝/拆箱匹配

接下來將第二匹配原則中的 long 方法也刪除掉,實現代碼如下:

  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:按照繼承路線依次向上匹配

此時將第三匹配原則中的 Integer 方法刪除,剩下代碼如下:

  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:可變參數匹配

最后將代碼中的方法刪除的只剩一個可選參數,實現代碼如下:

  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(int... num) { // 可選參數 
  8.         System.out.println("調用 int... 方法"); 
  9.     } 

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

從上述執行結果可以看出,方法重載的第五匹配原則是,匹配可選參數。

總結

在同一個類中定義了多個同名方法,但每個方法的參數類型或者是參數個數不同就是方法重載。方法重載的典型使用場景是 String 中的 valueOf 方法,它有 9 種實現。方法返回類型不能作為方法重載的依據,因為它不是方法簽名的組成部分。方法重載有 5 個匹配原則:精準匹配、基本類型自動轉換成更大的基本類型匹配、自動裝/拆箱匹配、按照繼承路線依次向上匹配、可變參數匹配。

 

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

2022-01-11 06:53:23

面試重寫重載

2022-12-22 14:32:37

JavaScript編程語言

2014-11-19 14:48:58

Nutch爬蟲Lucene

2022-04-11 19:55:26

函數類型函數重載

2019-08-16 10:10:07

hashcodeequalsJava

2020-12-30 10:04:46

userMapper接口

2024-09-11 08:38:02

JavaScriptC#語言編程

2021-05-30 09:25:48

HttpETag 網絡協議

2022-05-12 15:20:17

Wi-Fi 6無線網絡

2013-08-05 11:15:45

GoogleNexus系列

2022-02-15 07:03:04

start 源碼run線程

2022-07-27 07:36:01

TCP可靠性

2023-08-29 07:46:08

Redis數據ReHash

2021-11-08 11:02:01

Go函數重載

2020-08-16 11:29:12

Python函數開發

2020-10-14 08:33:23

Prometheus監控體系

2016-12-28 10:37:46

AndroidGradleApache Ant

2022-07-13 07:06:47

HTTPSHTTP協議

2023-12-06 09:10:28

JWT微服務

2022-07-06 13:48:24

RedisSentinel機制
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕在线观看一区 | 在线观看亚洲专区 | 成人久久久 | 在线观看国产视频 | 91久久精品一区二区三区 | 国产伦一区二区三区视频 | 久草成人| 黄色在线观看国产 | 精品国产乱码久久久久久中文 | 精品国产乱码久久久久久丨区2区 | 精品美女视频在线观看免费软件 | 色婷婷久久久久swag精品 | 欧美在线| 国产激情视频网站 | 免费看啪啪网站 | www.久久 | 国产精品18毛片一区二区 | 久久精彩视频 | 免费在线观看一区二区 | 中文字幕一区在线 | 91看国产| 懂色av一区二区三区在线播放 | 黄色毛片在线观看 | 妞干网av| 亚洲福利 | 91精品国产高清一区二区三区 | 日韩精品一区二区三区四区视频 | 中文字幕一区二区三区在线乱码 | 影音先锋中文字幕在线观看 | 欧美性生交大片免费 | 日韩成人精品视频 | 日韩精品视频网 | 免费三级av | 国产精品乱码一二三区的特点 | 91porn成人精品 | www.日韩 | 亚洲一区精品视频 | 欧美精品一区二区三区在线播放 | 精品国产一区二区三区久久久四川 | 黄色成人av | 人人做人人澡人人爽欧美 |