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

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

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

分派(Dispatch)可能是靜態(tài)也可能是動態(tài)的,根據分派依據的宗量數可分為單分派和多分派。這兩種分派方式的兩兩組合就構成了靜態(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)類型是在編譯期可知的;而實際類型變化 的結果在運行期才可確定,編譯器在編譯程序的時候并不知道一個對象的實際地址是什么。

靜態(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");
  }
 }

當調用print方法時,打印的將是"it is Super".

2、 調用“合適”的方法

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

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類型參數的方法,但編譯器通過參數自動轉型幫你找到了一個“合適”的方法調用。

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

下面這個例子,沒有參數為Sub的方法,按照參數自動轉型,查找最合適方法的方式,會找到Super為參數方法調用。

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");
  }
 }

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

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");
  }
 }

在調用的時候強制轉換,指定類型,就可以解決了。

Printer.print((App)null);

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

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

相關文章

  • 基于Java實現緩存Cache的深入分析

    基于Java實現緩存Cache的深入分析

    本篇文章是對Java實現緩存Cache進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • Java多線程編程中使用DateFormat類

    Java多線程編程中使用DateFormat類

    這篇文章主要介紹了Java多線程編程中使用DateFormat類,文中介紹了三種相關的并發(fā)使用方法,需要的朋友可以參考下
    2015-07-07
  • 用java實現學生信息管理系統(tǒng)

    用java實現學生信息管理系統(tǒng)

    這篇文章主要為大家詳細介紹了java實現學生信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Java基礎之SpringBoot整合knife4j

    Java基礎之SpringBoot整合knife4j

    Swagger現在已經成了最流行的接口文檔生成與管理工具,但是你是否在用的時候也在吐槽,它是真的不好看,接口測試的json數據沒法格式化,測試地址如果更改了還要去改配置,接口測試時增加token驗證是真的麻煩…針對Swagger的種種缺點,Knife4j就呼之欲出了.需要的朋友可以參考下
    2021-05-05
  • Java加載與存儲指令之ldc與_fast_aldc指令

    Java加載與存儲指令之ldc與_fast_aldc指令

    ldc指令將int、float、或者一個類、方法類型或方法句柄的符號引用、還可能是String型常量值從常量池中推送至棧頂。這一篇介紹一個虛擬機規(guī)范中定義的一個字節(jié)碼指令ldc,另外還有一個虛擬機內部使用的字節(jié)碼指令_fast_aldc。需要的盆友可參考下面文章的內容
    2021-09-09
  • java 后臺將base64字符串保存為圖片的方法

    java 后臺將base64字符串保存為圖片的方法

    本篇文章主要介紹了java 后臺將base64字符串保存為圖片的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Jmeter邏輯控制器事務控制器使用方法解析

    Jmeter邏輯控制器事務控制器使用方法解析

    這篇文章主要介紹了Jmeter邏輯控制器事務控制器使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • 淺析Spring Security登錄驗證流程源碼

    淺析Spring Security登錄驗證流程源碼

    這篇文章主要介紹了Spring Security登錄驗證流程源碼解析,本文結合源碼講解登錄驗證流程,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • Java使用PrepareStatement實現數據的插入與查詢操作

    Java使用PrepareStatement實現數據的插入與查詢操作

    這篇文章主要為大家詳細介紹了Java如何使用PrepareStatement實現數據的插入與查詢操作,文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-09-09
  • JAVA冒泡排序和二分查找的實現

    JAVA冒泡排序和二分查找的實現

    本文詳細介紹了JAVA冒泡排序和二分查找的實現,雖然這兩種算法比較簡單,但是確實我們必須需要掌握的。下面來看看。
    2016-07-07

最新評論