欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中為什么不同的返回類型不算方法重載

 更新時(shí)間:2022年05月11日 17:20:32   作者:??Java中文社群????  
這篇文章主要介紹了Java中為什么不同的返回類型不算方法重載,方法重載是指在同一個(gè)類中,定義了多個(gè)同名方法,但每個(gè)方法的參數(shù)類型或者是參數(shù)個(gè)數(shù)不同就是方法重載,下文詳細(xì)介紹,需要的小伙伴可以參考一下

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

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

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

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

如下代碼所示:

public class OverloadExample {
    public static void main(String[] args) {
        OverloadExample example = new OverloadExample();
        example.method("磊哥"); // JVM 應(yīng)該調(diào)用哪個(gè)方法?
    }
    public int method(String name) {
        // doSomething
        return 666;
    }
    public String method(String name) {
        // doSomething
        return "磊哥聊編程";
    }
}

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

方法重載的使用場景

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

如下圖所示: 

 它可以將數(shù)組、對(duì)象和基礎(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)方法重載時(shí),程序要調(diào)用哪個(gè)方法呢?執(zhí)行以上程序的執(zhí)行結(jié)果如下: 

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

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

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

匹配原則2:基本類型自動(dòng)轉(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)用的第二匹配原則是自動(dòng)轉(zhuǎn)換成更大的基本數(shù)據(jù)類型。

匹配原則3:自動(dòng)裝/拆箱匹配

接下來將第二匹配原則中的 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é)果可以看出,方法重載的第三匹配原則是,匹配自動(dòng)裝箱或拆箱的數(shù)據(jù)類型。

匹配原則4:按照繼承路線依次向上匹配

此時(shí)將第三匹配原則中的 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ù)匹配

最后將代碼中的方法刪除的只剩一個(gè)可選參數(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é)

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

到此這篇關(guān)于Java中為什么不同的返回類型不算方法重載的文章就介紹到這了,更多相關(guān)Java返回類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 200行Java代碼編寫一個(gè)計(jì)算器程序

    200行Java代碼編寫一個(gè)計(jì)算器程序

    本篇文章給大家分享的只用200行java代碼,實(shí)現(xiàn)一個(gè)計(jì)算器程序,不僅能夠計(jì)算加減乘除,還能夠匹配小括號(hào)。實(shí)現(xiàn)代碼超簡單,需要的朋友參考下吧
    2017-12-12
  • JAVA拋出異常的三種形式詳解

    JAVA拋出異常的三種形式詳解

    這篇文章主要介紹了JAVA拋出異常的三種形式詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 關(guān)于java中基本數(shù)據(jù)類型的數(shù)值范圍

    關(guān)于java中基本數(shù)據(jù)類型的數(shù)值范圍

    這篇文章主要介紹了關(guān)于java中基本數(shù)據(jù)類型的數(shù)值范圍,基本類型,或者叫做內(nèi)置類型,是JAVA中不同于類的特殊類型,它們是我們編程中使用最頻繁的類型,需要的朋友可以參考下
    2023-07-07
  • 詳解JAVA 線程-線程的狀態(tài)有哪些?它是如何工作的?

    詳解JAVA 線程-線程的狀態(tài)有哪些?它是如何工作的?

    這篇文章主要介紹了詳解JAVA 線程的的相關(guān)資料,文中講解非常細(xì)致,源碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以參考下
    2020-06-06
  • 解析Spring Data JPA的Audit功能之審計(jì)數(shù)據(jù)庫變更

    解析Spring Data JPA的Audit功能之審計(jì)數(shù)據(jù)庫變更

    Spring Data JPA 提供了Audit審計(jì)功能,用來記錄創(chuàng)建時(shí)間、創(chuàng)建人、修改時(shí)間、修改人等,下面來詳細(xì)講解下審計(jì)數(shù)據(jù)庫變更
    2021-06-06
  • SpringBoot中的JPA(Java?Persistence?API)詳解

    SpringBoot中的JPA(Java?Persistence?API)詳解

    這篇文章主要介紹了SpringBoot中的JPA(Java?Persistence?API)詳解,JPA用于將?Java?對(duì)象映射到關(guān)系型數(shù)據(jù)庫中,它提供了一種面向?qū)ο蟮姆绞絹聿僮鲾?shù)據(jù)庫,使得開發(fā)者可以更加方便地進(jìn)行數(shù)據(jù)持久化操作,需要的朋友可以參考下
    2023-07-07
  • 詳解JUnit5參數(shù)化測試的幾種方式

    詳解JUnit5參數(shù)化測試的幾種方式

    參數(shù)化測試一直是津津樂道的話題,我們都知道JMeter有四種參數(shù)化方式:用戶自定義變量、用戶參數(shù)、CSV文件、函數(shù)助手,那么JUnit5有哪些參數(shù)化測試的方式呢
    2021-07-07
  • JAVA8發(fā)送帶有Body的HTTP GET請(qǐng)求

    JAVA8發(fā)送帶有Body的HTTP GET請(qǐng)求

    本文主要介紹了JAVA8發(fā)送帶有Body的HTTP GET請(qǐng)求,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 詳解mall整合SpringBoot+MyBatis搭建基本骨架

    詳解mall整合SpringBoot+MyBatis搭建基本骨架

    這篇文章主要介紹了詳解mall整合SpringBoot+MyBatis搭建基本骨架,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Java調(diào)用opencv IDEA環(huán)境配置的教程詳解

    Java調(diào)用opencv IDEA環(huán)境配置的教程詳解

    這篇文章主要為大家詳細(xì)介紹了Java調(diào)用opencv IDEA環(huán)境配置的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03

最新評(píng)論