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

java?JVM方法分派模型靜態(tài)分派動態(tài)分派全面講解

 更新時間:2022年06月23日 16:37:18   作者:Carson.Ho  
這篇文章主要為大家介紹了java?JVM方法分派模型靜態(tài)分派動態(tài)分派全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

  • 了解 行為方法分派 有利于在行為分派時時進行一些功能操作
  • 本文全面講解行為分派的類型:靜態(tài) & 動態(tài)行為分派,希望你們會喜歡。

目錄結構圖

1. 知識儲備

1.1 分派

  • 定義:確定執(zhí)行哪個方法 的過程

a. 疑問

有些讀者會問,方法的執(zhí)行不是取決于代碼設置中的執(zhí)行對象嗎?為什么還要選擇呢?

b. 回答

  • 若 一個對象對應于多個方法 時,就需要進行選擇了
  • 讀者應該都想到了 Java中的特性:多態(tài),即重寫 & 重載。下面我會詳細講解。
  • 分類:靜態(tài)分派 & 動態(tài)分派。下面我將詳細講解。

1.2 變量的靜態(tài)類型 & 動態(tài)類型

先看下面的代碼

public class Test { 
    static abstract class Human { 
    } 
    static class Man extends Human { 
    } 
    static class Woman extends Human { 
    } 
// 執(zhí)行代碼
public static void main(String[] args) { 
  Human man = new Man(); 
  // 變量man的靜態(tài)類型 = 引用類型 = Human:不會被改變、在編譯器可知
  // 變量man的動態(tài)類型 = 實例對象類型 = Man:會變化、在運行期才可知
    } 
}

即:

  • 變量的靜態(tài)類型 = 引用類型 :不會被改變、在編譯器可知
  • 變量的動態(tài)類型 = 實例對象類型 :會變化、在運行期才可知

下面,我將詳細講解Java中的分派類型:靜態(tài)分派 & 動態(tài)分派

2. 靜態(tài)分派

定義: 根據(jù) 變量的靜態(tài)類型 進行方法分派 的 行為

  • 即根據(jù) 變量的靜態(tài)類型 確定執(zhí)行哪個方法
  • 發(fā)生在編譯期,所以不由 Java 虛擬機來執(zhí)行

應用場景: 方法重載(OverLoad

實例說明

public class Test { 
// 類定義
    static abstract class Human { 
    } 
// 繼承自抽象類Human
    static class Man extends Human { 
    } 
    static class Woman extends Human { 
    } 
// 可供重載的方法
    public void sayHello(Human guy) { 
        System.out.println("hello,guy!"); 
    } 
    public void sayHello(Man guy) { 
        System.out.println("hello gentleman!"); 
    } 
    public void sayHello(Woman guy) { 
        System.out.println("hello lady!"); 
    } 
// 測試代碼
    public static void main(String[] args) { 
        Human man = new Man(); 
        Human woman = new Woman(); 
        Test test = new Test(); 
        test.sayHello(man); 
        test.sayHello(woman); 
    } 
}
// 運行結果
hello,guy! 
hello,guy!

根據(jù)上述的講解,大家應該明白運行結果的原因:

  • 方法重載(OverLoad) = 靜態(tài)分派 = 根據(jù) 變量的靜態(tài)類型 確定執(zhí)行(重載)哪個方法
  • 所以上述的方法執(zhí)行時,是根據(jù)變量(man、woman)的靜態(tài)類型(Human)確定重載sayHello()中參數(shù)為Human guy的方法,即sayHello(Human guy)

特別注意

a. 變量的靜態(tài)類型 發(fā)生變化 的情況

可通過 強制類型轉(zhuǎn)換 改變 變量的靜態(tài)類型

Human man = new Man(); 
test.sayHello((Man)man); 
// 強制類型轉(zhuǎn)換
// 此時man的靜態(tài)類型從 Human 變?yōu)?Man
// 所以會調(diào)用sayHello()中參數(shù)為Man guy的方法,即sayHello(Man guy)

b. 靜態(tài)分派的優(yōu)先級匹配問題

問題描述:

  • 背景 現(xiàn)需要進行靜態(tài)分派
  • 問題 程序中 沒有顯示指定 靜態(tài)類型
  • 解決方案 程序會根據(jù) 靜態(tài)類型的優(yōu)先級 從而選擇 優(yōu)先的靜態(tài)類型進行方法分配。

實例說明

public class Overload {  
    private static void sayHello(char arg){  
        System.out.println("hello char");  
    }  
    private static void sayHello(Object arg){  
        System.out.println("hello Object");  
    }  
    private static void sayHello(int arg){  
        System.out.println("hello int");  
    }  
    private static void sayHello(long arg){  
        System.out.println("hello long");  
    }  
// 測試代碼
    public static void main(String[] args) {  
        sayHello('a');  
    }  
}  
// 運行結果
hello char

因為‘a’是一個char類型數(shù)據(jù)(即靜態(tài)類型是char),所以會選擇參數(shù)類型為char的重載方法。

若注釋掉sayHello(char arg)方法,那么會輸出

hello int

因為‘a’除了可代表字符串,還可代表數(shù)字97。因此當沒有最合適的sayHello(char arg)方式進行重載時,會選擇第二合適(第二優(yōu)先級)的方法重載,即 sayHello(int arg)

總結:當沒有最合適的方法進行重載時,會選優(yōu)先級第二高的的方法進行重載,如此類推。

優(yōu)先級順序為:

char>int>long>float>double>Character>Serializable>Object>...

其中...為變長參數(shù),將其視為一個數(shù)組元素。變長參數(shù)的重載優(yōu)先級最低。

因為 char 轉(zhuǎn)型到 byteshort 的過程是不安全的,所以不會選擇參數(shù)類型為byteshort的方法進行重載,故優(yōu)先級列表里也沒有。

特別注意

  • 上面講解的主要是 基本數(shù)據(jù)類型的優(yōu)先級匹配問題
  • 若是引用類型,則根據(jù) 繼承關系 進行優(yōu)先級匹配

注意只跟其編譯時類型(即靜態(tài)類型)相關

3. 動態(tài)分派

  • 定義 根據(jù) 變量的動態(tài)類型 進行方法分派 的 行為

即根據(jù) 變量的動態(tài)類型 確定執(zhí)行哪個方法

  • 應用場景 方法重寫(Override
  • 實例說明
// 定義類
    class Human { 
        public void sayHello(){ 
            System.out.println("Human say hello"); 
        } 
    } 
// 繼承自 抽象類Human 并 重寫sayHello()
    class Man extends Human { 
        @Override 
        protected void sayHello() { 
            System.out.println("man say hello"); 
        } 
    } 
    class Woman extends Human { 
        @Override 
        protected void sayHello() { 
            System.out.println("woman say hello"); 
        } 
    } 
// 測試代碼
    public static void main(String[] args) { 
        // 情況1
        Human man = new man(); 
        man.sayHello(); 
        // 情況2
        man = new Woman(); 
        man.sayHello(); 
    } 
}
// 運行結果
man say hello
woman say hello
// 原因解析
// 1. 方法重寫(Override) = 動態(tài)分派 = 根據(jù) 變量的動態(tài)類型 確定執(zhí)行(重寫)哪個方法
// 2. 對于情況1:根據(jù)變量(Man)的動態(tài)類型(man)確定調(diào)用man中的重寫方法sayHello()
// 3. 對于情況2:根據(jù)變量(Man)的動態(tài)類型(woman)確定調(diào)用woman中的重寫方法sayHello()

特別注意

對于代碼中:

Human man = new Man(); 
man = new Woman(); 
man.sayHello(); 
// man稱為執(zhí)行sayHello()方法的所有者,即接受者。
  • invokevirtual指令執(zhí)行的第一步 = 確定接受者的實際類型
  • invokevirtual指令執(zhí)行的第二步 = 將 常量池中 類方法符號引用 解析到不同的直接引用上

第二步即方法重寫(Override)的本質(zhì)

4. 二者區(qū)別

 總結

本文全面講解方法分派的類型 & 過程,更多關于java JVM靜態(tài)動態(tài)分派模型的資料請關注腳本之家其它相關文章!

相關文章

  • 關于Sentinel中冷啟動限流原理WarmUpController

    關于Sentinel中冷啟動限流原理WarmUpController

    這篇文章主要介紹了關于Sentinel中冷啟動限流原理WarmUpController,具有很好的參考價值,希望對大家有所幫助。
    2023-04-04
  • SpringBoot自定義注解實現(xiàn)Token校驗的方法

    SpringBoot自定義注解實現(xiàn)Token校驗的方法

    這篇文章主要介紹了SpringBoot自定義注解實現(xiàn)Token校驗的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • java compareTo和compare方法比較詳解

    java compareTo和compare方法比較詳解

    這篇文章主要介紹了java compareTo和compare方法比較詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 超詳細講解Java線程池

    超詳細講解Java線程池

    本文主要介紹了Java線程池,本文運用大量代碼和圖片講解相關知識,感興趣的小伙伴一起來看看吧
    2021-09-09
  • SpringBoot中的PropertySource原理詳解

    SpringBoot中的PropertySource原理詳解

    這篇文章主要介紹了SpringBoot中的PropertySource原理詳解,PropertySource?是一個非常重要的概念,它允許您在應用程序中定義屬性,并將這些屬性注入到?Spring?環(huán)境中,需要的朋友可以參考下
    2023-07-07
  • Java中在時間戳計算的過程中遇到的數(shù)據(jù)溢出問題解決

    Java中在時間戳計算的過程中遇到的數(shù)據(jù)溢出問題解決

    這篇文章主要介紹了Java中在時間戳計算的過程中遇到的數(shù)據(jù)溢出問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-06-06
  • java統(tǒng)計字符串中指定元素出現(xiàn)次數(shù)方法

    java統(tǒng)計字符串中指定元素出現(xiàn)次數(shù)方法

    這篇文章主要介紹了java統(tǒng)計字符串中指定元素出現(xiàn)次數(shù)方法,需要的朋友可以參考下
    2015-12-12
  • Java Spring @Lazy延遲注入源碼案例詳解

    Java Spring @Lazy延遲注入源碼案例詳解

    這篇文章主要介紹了Java Spring @Lazy延遲注入源碼案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • SpringBoot集成支付寶沙箱支付的實現(xiàn)示例

    SpringBoot集成支付寶沙箱支付的實現(xiàn)示例

    本文主要介紹了SpringBoot集成支付寶沙箱支付的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Spring Cloud Alibaba Nacos 入門詳解

    Spring Cloud Alibaba Nacos 入門詳解

    這篇文章主要介紹了Spring Cloud Alibaba Nacos入門詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03

最新評論