成人免费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

2021-05-30 09:25:48

HttpETag 網絡協議

2020-12-30 10:04:46

userMapper接口

2024-09-11 08:38:02

JavaScriptC#語言編程

2022-05-12 15:20:17

Wi-Fi 6無線網絡

2013-08-05 11:15:45

GoogleNexus系列

2022-02-15 07:03:04

start 源碼run線程

2023-08-29 07:46:08

Redis數據ReHash

2022-07-27 07:36:01

TCP可靠性

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精品国产一区二区三区 | 中文字幕精品一区 | 欧美中文一区 | 久久久91精品国产一区二区三区 | 69xxx免费| 亚洲最大看片网站 | 免费观看av| av在线免费观看网站 | 欧美一区二区三区在线看 | 国产a级黄色录像 | 91视频网址 | 日韩中文字幕免费在线观看 | 黄色片网站国产 | 亚洲天堂久久 | 一区二区视频在线 | 天天曰天天干 | 精品1区2区3区 | 日韩天堂av| 国产色网站 | 国产精品视频不卡 | www.99热这里只有精品 | 天天爱综合 | 久久伊人免费视频 | 国产乱码精品一区二区三区中文 | 久久久久国产精品 | 91精品国产91久久久久久 | 超碰成人免费 |