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

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

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

作者:磊哥

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

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

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

方法重載是指在同一個類中,定義了多個同名方法,但每個方法的參數(shù)類型或者是參數(shù)個數(shù)不同就是方法重載。比如以下 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.     } 

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

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

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

  1. public class OverloadExample { 
  2.     public static void main(String[] args) { 
  3.         OverloadExample example = new OverloadExample(); 
  4.         example.method("磊哥"); // JVM 應(yīng)該調(diào)用哪個方法? 
  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 就推斷不出來要調(diào)用哪個方法了,所以方法的返回類型不能作為方法簽名的一部分。

方法重載的使用場景

方法重載的經(jīng)典使用場景是 String 類型的 valueOf 方法,valueOf 方法重載有 9 種實(shí)現(xiàn),如下圖所示:

它可以將數(shù)組、對象和基礎(chǔ)數(shù)據(jù)類型轉(zhuǎn)換成字符串類型。

方法重載匹配原則

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

當(dāng)出現(xiàn)方法重載時,程序要調(diào)用哪個方法呢?執(zhí)行以上程序的執(zhí)行結(jié)果如下:

因此我們可以得出以下結(jié)論。

匹配原則1:精準(zhǔn)類型匹配

方法重載會優(yōu)先調(diào)用和方法參數(shù)類型一模一樣的方法,這是第一優(yōu)先匹配原則:精準(zhǔn)類型匹配。

匹配原則2:基本類型自動轉(zhuǎn)換成更大的基本類型

接下來我們把精準(zhǔn)匹配方法刪掉,觀察一下第二匹配順序是什么?實(shí)現(xiàn)代碼如下:

  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é)果如下圖所示:

因此我們可以得出結(jié)論:如果是基本數(shù)據(jù)類型,那么方法重載調(diào)用的第二匹配原則是自動轉(zhuǎn)換成更大的基本數(shù)據(jù)類型。

匹配原則3:自動裝/拆箱匹配

接下來將第二匹配原則中的 long 方法也刪除掉,實(shí)現(xiàn)代碼如下:

  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é)果如下圖所示:

從上述執(zhí)行結(jié)果可以看出,方法重載的第三匹配原則是,匹配自動裝箱或拆箱的數(shù)據(jù)類型。

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

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

從上述執(zhí)行結(jié)果可以看出,方法重載的第四匹配原則是,依次向上匹配父類的方法調(diào)用。

匹配原則5:可變參數(shù)匹配

最后將代碼中的方法刪除的只剩一個可選參數(shù),實(shí)現(xiàn)代碼如下:

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

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

從上述執(zhí)行結(jié)果可以看出,方法重載的第五匹配原則是,匹配可選參數(shù)。

總結(jié)

在同一個類中定義了多個同名方法,但每個方法的參數(shù)類型或者是參數(shù)個數(shù)不同就是方法重載。方法重載的典型使用場景是 String 中的 valueOf 方法,它有 9 種實(shí)現(xiàn)。方法返回類型不能作為方法重載的依據(jù),因?yàn)樗皇欠椒ê灻慕M成部分。方法重載有 5 個匹配原則:精準(zhǔn)匹配、基本類型自動轉(zhuǎn)換成更大的基本類型匹配、自動裝/拆箱匹配、按照繼承路線依次向上匹配、可變參數(shù)匹配。

 

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

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

函數(shù)類型函數(shù)重載

2019-08-16 10:10:07

hashcodeequalsJava

2024-09-11 08:38:02

JavaScriptC#語言編程

2020-12-30 10:04:46

userMapper接口

2021-05-30 09:25:48

HttpETag 網(wǎng)絡(luò)協(xié)議

2022-05-12 15:20:17

Wi-Fi 6無線網(wǎng)絡(luò)

2022-02-15 07:03:04

start 源碼run線程

2013-08-05 11:15:45

GoogleNexus系列

2021-11-08 11:02:01

Go函數(shù)重載

2022-07-27 07:36:01

TCP可靠性

2023-08-29 07:46:08

Redis數(shù)據(jù)ReHash

2020-08-16 11:29:12

Python函數(shù)開發(fā)

2020-10-14 08:33:23

Prometheus監(jiān)控體系

2016-12-28 10:37:46

AndroidGradleApache Ant

2022-07-13 07:06:47

HTTPSHTTP協(xié)議

2023-12-06 09:10:28

JWT微服務(wù)

2022-07-06 13:48:24

RedisSentinel機(jī)制
點(diǎn)贊
收藏

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