最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JVM 方法調(diào)用之靜態(tài)分派(詳解)

 更新時間:2017年05月01日 09:21:21   投稿:jingxian  
下面小編就為大家?guī)硪黄狫VM 方法調(diào)用之靜態(tài)分派(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

分派(Dispatch)可能是靜態(tài)也可能是動態(tài)的,根據(jù)分派依據(jù)的宗量數(shù)可分為單分派和多分派。這兩種分派方式的兩兩組合就構成了靜態(tài)單分派,靜態(tài)多分派,動態(tài)單分派,動態(tài)多分派這4種組合。本章講靜態(tài)分派。

1、靜態(tài)分派

所有依賴靜態(tài)類型來定位方法執(zhí)行版本的分派動作稱為靜態(tài)分派。靜態(tài)分派的典型應用是方法重載。靜態(tài)分派發(fā)生在編譯階段,因此確定靜態(tài)分派的動作實際上不是由虛擬機來執(zhí)行的。

那么什么是靜態(tài)類型(static type)呢?

Super object = new Sub();

像上面的語句,Super是變量的靜態(tài)類型,Sub是變量的實際類型(actual type),靜態(tài)類型和實際類型在程序中都可以發(fā)生一些變化,區(qū)別是靜態(tài)類型的變化僅僅在使用時發(fā)生,變量本身的靜態(tài)類型不會被改變,并且最終的靜態(tài)類型是在編譯期可知的;而實際類型變化 的結(jié)果在運行期才可確定,編譯器在編譯程序的時候并不知道一個對象的實際地址是什么。

靜態(tài)分派一詞實際上是中文翻譯特有的,國外的技術文檔都是將其稱為Method Overload Resolution。這樣一來就更好理解了,因為是Resolution(解析)

下面的代碼可以說明這一點:

public static class Printer {
  public static void print(Super object) {
   System.out.println("it is Super");
  }
  
  public static void print(Sub object) {
   System.out.println("it is Sub");
  }
 }

當調(diào)用print方法時,打印的將是"it is Super".

2、 調(diào)用“合適”的方法

編譯器雖然能確定出方法的重載版本,但在很多情況下這個重載版本并不是“唯一的”,往往只能確定一個“更加合適”的版本。什么意思呢?看看下面的代碼。

public static void main(String[] args) {
  char c = 'a';
  Printer.print(c);
 }
 
 public static class Printer {

  public static void print(int i) {
   System.out.println("it is int");
  }
  
  public static void print(byte b) {
   System.out.println("it is byte");
  }
 }

上面的代碼可以執(zhí)行嗎?乍看之下,沒有類型為char的重載方法,是不是會報錯?實際上,會打印出 it is int。也就是說,雖然沒有char類型參數(shù)的方法,但編譯器通過參數(shù)自動轉(zhuǎn)型幫你找到了一個“合適”的方法調(diào)用。

轉(zhuǎn)換的路徑是char->int->long->float->double,如果還沒找到合適的方法,則自動裝箱成Character,此時已經(jīng)是一個類。如果還找不到,則開始查找該類實現(xiàn)的接口(優(yōu)先),父類(在繼承關系中從下往上找,越接近上層的優(yōu)先級越低)。如果有多個接口同時出現(xiàn)兩個參數(shù)一致的,此時優(yōu)先級是一樣的,編譯器無法確定自動轉(zhuǎn)型為哪種類型,會提示類型模糊,拒絕編譯。程序必須在調(diào)用時顯式地指定字段的靜態(tài)類型。

下面這個例子,沒有參數(shù)為Sub的方法,按照參數(shù)自動轉(zhuǎn)型,查找最合適方法的方式,會找到Super為參數(shù)方法調(diào)用。

public static void main(String[] args) {
  Sub object = new Sub();
  Printer.print(object);
 }
 
 public static class Printer {
  public static void print(Super object) {
   System.out.println("it is Super");
  }
 }

此外還要注意一點是傳入?yún)?shù)為null. 如果重載方法里有兩個不同的類型的參數(shù),即使兩者沒有繼承關系,編譯器也會判斷不了到底調(diào)用哪個。

public static void main(String[] args) {
  Printer.print(null);
 }
 
 public static class Printer {
  public static void print(Super object) {
   System.out.println("it is Super");
  }
  
  public static void print(App app) {
   System.out.println("it is App");
  }
 }

在調(diào)用的時候強制轉(zhuǎn)換,指定類型,就可以解決了。

Printer.print((App)null);

要注意的一點是,解析與分派這兩者之間的關系并不是二選一的排他關系,它們是在不同層次上去篩選,確定目標方法的過程。例如,靜態(tài)方法在類加載期就會解析,但靜態(tài)方法也是可以有重載版本的,選擇重載版本的過程也是通過靜態(tài)分派完成的。

以上這篇JVM 方法調(diào)用之靜態(tài)分派(詳解)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • java中l(wèi)ist使用時需避免的場景總結(jié)

    java中l(wèi)ist使用時需避免的場景總結(jié)

    眾所周知,Java為開發(fā)者提供了多種集合類的實現(xiàn),其中幾乎所有業(yè)務代碼都需要用到List,但List的錯誤使用也會導致諸多問題,所以本文我們就來看一看幾個錯誤使用List的場景吧
    2023-10-10
  • js中去除字符串中所有的html標簽代碼實例

    js中去除字符串中所有的html標簽代碼實例

    這篇文章主要介紹了js中去除字符串中所有的html標簽代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • Java線程中synchronized和volatile關鍵字的區(qū)別詳解

    Java線程中synchronized和volatile關鍵字的區(qū)別詳解

    這篇文章主要介紹了Java線程中synchronized和volatile關鍵字的區(qū)別詳解,synchronzied既能夠保障可見性,又能保證原子性,而volatile只能保證可見性,無法保證原子性,volatile不需要加鎖,比synchronized更輕量級,不會阻塞線程,需要的朋友可以參考下
    2024-01-01
  • IDEA上運行Flink任務的實戰(zhàn)教程

    IDEA上運行Flink任務的實戰(zhàn)教程

    這篇文章主要介紹了IDEA上運行Flink任務的實戰(zhàn)教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • java實現(xiàn)小球碰撞功能

    java實現(xiàn)小球碰撞功能

    這篇文章主要為大家詳細介紹了java實現(xiàn)小球碰撞功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • Opencv創(chuàng)建車牌圖片識別系統(tǒng)方法詳解

    Opencv創(chuàng)建車牌圖片識別系統(tǒng)方法詳解

    本文主要介紹了一個基于spring?boot+maven+opencv實現(xiàn)的圖像識別及訓練項目,可以實現(xiàn)車牌識別功能,感興趣的可以跟隨小編一起試一試
    2022-01-01
  • Java通過MySQL的加解密函數(shù)實現(xiàn)敏感字段存儲

    Java通過MySQL的加解密函數(shù)實現(xiàn)敏感字段存儲

    這篇文章主要介紹了如何在Java中MySQL的加解密函數(shù)實現(xiàn)敏感字段存儲,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-03-03
  • Java中的關鍵字_動力節(jié)點Java學院整理

    Java中的關鍵字_動力節(jié)點Java學院整理

    關鍵字也稱為保留字,是指Java語言中規(guī)定了特定含義的標示符。對于保留字,用戶只能按照系統(tǒng)規(guī)定的方式使用,不能自行定義
    2017-04-04
  • java 生成文字圖片的示例代碼

    java 生成文字圖片的示例代碼

    本篇文章主要介紹了java 生成文字圖片的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • springboot整合webservice使用簡單案例總結(jié)

    springboot整合webservice使用簡單案例總結(jié)

    WebService是一個SOA(面向服務的編程)的架構,它是不依賴于語言,平臺等,可以實現(xiàn)不同的語言間的相互調(diào)用,下面這篇文章主要給大家介紹了關于springboot整合webservice使用的相關資料,需要的朋友可以參考下
    2024-07-07

最新評論

休宁县| 中宁县| 万源市| 武鸣县| 岳池县| 桂林市| 海城市| 偃师市| 万安县| 玉山县| 鹿泉市| 定边县| 团风县| 通辽市| 洛川县| 绥江县| 岐山县| 长寿区| 托里县| 抚松县| 河南省| 桃江县| 仁布县| 嵩明县| 云浮市| 老河口市| 三都| 张家口市| 金坛市| 肥乡县| 泸西县| 蒲城县| 高台县| 广河县| 阳春市| 简阳市| 福安市| 甘南县| 肃南| 汉源县| 北票市|