Java中為什么不同的返回類型不算方法重載
方法重載是指在同一個類中,定義了多個同名方法,但每個方法的參數(shù)類型或者是參數(shù)個數(shù)不同就是方法重載。 比如以下 4 個 method 方法就可以稱之為方法重載,
如下代碼所示:
public class OverloadExample {
public void method() {
// doSomething
}
public void method(String name) {
// doSomething
}
public void method(Integer id) {
// doSomething
}
public void method(Integer id, String name) {
// doSomething
}
}為什么不同返回類型不算方法重載?
要回答這個問題,首先要了解一點(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)用哪個方法了,
如下代碼所示:
public class OverloadExample {
public static void main(String[] args) {
OverloadExample example = new OverloadExample();
example.method("磊哥"); // JVM 應(yīng)該調(diào)用哪個方法?
}
public int method(String name) {
// doSomething
return 666;
}
public String method(String name) {
// doSomething
return "磊哥聊編程";
}
}像以上情況,JVM 就推斷不出來要調(diào)用哪個方法了,所以方法的返回類型不能作為方法簽名的一部分。
方法重載的使用場景
方法重載的經(jīng)典使用場景是 String 類型的 valueOf 方法,valueOf 方法重載有 9 種實(shí)現(xiàn),
如下圖所示:

它可以將數(shù)組、對象和基礎(chǔ)數(shù)據(jù)類型轉(zhuǎn)換成字符串類型。
方法重載匹配原則
方法重載的調(diào)用順序是有前后之分的,比如以下代碼:
public class OverloadExample {
public static void main(String[] args) {
OverloadExample example = new OverloadExample();
example.method(12);
}
public void method(int num) {
System.out.println("調(diào)用 int 方法");
}
public void method(long num) {
System.out.println("調(diào)用 long 方法");
}
public void method(Integer num) {
System.out.println("調(diào)用 Integer 方法");
}
public void method(Object num) {
System.out.println("調(diào)用 Object 方法");
}
public void method(int... num) { // 可選參數(shù)
System.out.println("調(diào)用 int... 方法");
}
}當(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)代碼如下:
public class OverloadExample {
public static void main(String[] args) {
OverloadExample example = new OverloadExample();
example.method(12);
}
public void method(long num) {
System.out.println("調(diào)用 long 方法");
}
public void method(Integer num) {
System.out.println("調(diào)用 Integer 方法");
}
public void method(Object num) {
System.out.println("調(diào)用 Object 方法");
}
public void method(int... num) { // 可選參數(shù)
System.out.println("調(diào)用 int... 方法");
}
}以上程序的執(zhí)行結(jié)果如下圖所示:

因此我們可以得出結(jié)論:如果是基本數(shù)據(jù)類型,那么方法重載調(diào)用的第二匹配原則是自動轉(zhuǎn)換成更大的基本數(shù)據(jù)類型。
匹配原則3:自動裝/拆箱匹配
接下來將第二匹配原則中的 long 方法也刪除掉,實(shí)現(xiàn)代碼如下:
public class OverloadExample {
public static void main(String[] args) {
OverloadExample example = new OverloadExample();
example.method(12);
}
public void method(Integer num) {
System.out.println("調(diào)用 Integer 方法");
}
public void method(Object num) {
System.out.println("調(diào)用 Object 方法");
}
public void method(int... num) { // 可選參數(shù)
System.out.println("調(diào)用 int... 方法");
}
}以上程序的執(zhí)行結(jié)果如下圖所示:

從上述執(zhí)行結(jié)果可以看出,方法重載的第三匹配原則是,匹配自動裝箱或拆箱的數(shù)據(jù)類型。
匹配原則4:按照繼承路線依次向上匹配
此時將第三匹配原則中的 Integer 方法刪除,剩下代碼如下:
public class OverloadExample {
public static void main(String[] args) {
OverloadExample example = new OverloadExample();
example.method(12);
}
public void method(Object num) {
System.out.println("調(diào)用 Object 方法");
}
public void method(int... num) { // 可選參數(shù)
System.out.println("調(diào)用 int... 方法");
}
}以上程序的執(zhí)行結(jié)果如下圖所示:

從上述執(zhí)行結(jié)果可以看出,方法重載的第四匹配原則是,依次向上匹配父類的方法調(diào)用。
匹配原則5:可變參數(shù)匹配
最后將代碼中的方法刪除的只剩一個可選參數(shù),實(shí)現(xiàn)代碼如下:
public class OverloadExample {
public static void main(String[] args) {
OverloadExample example = new OverloadExample();
example.method(12);
}
public void method(int... num) { // 可選參數(shù)
System.out.println("調(diào)用 int... 方法");
}
}以上程序的執(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ù)匹配。
到此這篇關(guān)于Java中為什么不同的返回類型不算方法重載的文章就介紹到這了,更多相關(guān)Java返回類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java使用JDBC連接postgresql數(shù)據(jù)庫示例
這篇文章主要介紹了Java使用JDBC連接postgresql數(shù)據(jù)庫,結(jié)合實(shí)例形式分析了jdbc連接postgresql數(shù)據(jù)庫及數(shù)值插入、更新、查詢等相關(guān)操作技巧,需要的朋友可以參考下2019-01-01
Springboot安全框架整合SpringSecurity實(shí)現(xiàn)方式
這篇文章主要介紹了Spring全家桶中Springboot安全框架整合SpringSecurity的實(shí)現(xiàn)方式,有需要的朋友可以借鑒參考下,希望可以有所幫助2021-09-09
spring使用ehcache實(shí)現(xiàn)頁面緩存示例
這篇文章主要介紹了spring使用ehcache實(shí)現(xiàn)頁面緩存示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02
Java實(shí)現(xiàn)的圖像查看器完整實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)的圖像查看器,以完整實(shí)例形式較為詳細(xì)的分析了java處理圖片的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10
springboot + JPA 配置雙數(shù)據(jù)源實(shí)戰(zhàn)
這篇文章主要介紹了springboot + JPA 配置雙數(shù)據(jù)源實(shí)戰(zhàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
Java實(shí)現(xiàn)解析并生成xml原理實(shí)例詳解
這篇文章主要介紹了Java實(shí)現(xiàn)解析并生成xml原理實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06
Java中的關(guān)鍵字_動力節(jié)點(diǎn)Java學(xué)院整理
關(guān)鍵字也稱為保留字,是指Java語言中規(guī)定了特定含義的標(biāo)示符。對于保留字,用戶只能按照系統(tǒng)規(guī)定的方式使用,不能自行定義2017-04-04
Hystrix?Turbine聚合監(jiān)控的實(shí)現(xiàn)詳解
微服務(wù)架構(gòu)下,?個微服務(wù)往往部署多個實(shí)例,如果每次只能查看單個實(shí)例的監(jiān)控,就需要經(jīng)常切換很不?便,在這樣的場景下,我們可以使??Hystrix?Turbine?進(jìn)?聚合監(jiān)控,它可以把相關(guān)微服務(wù)的監(jiān)控數(shù)據(jù)聚合在?起,便于查看2022-09-09

