一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - JVM 方法調用之靜態分派(詳解)

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

2020-09-22 10:07Java教程網 Java教程

下面小編就為大家帶來一篇JVM 方法調用之靜態分派(詳解)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

1、靜態分派

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

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

?
1
Super object = new Sub();

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

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

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

?
1
2
3
4
5
6
7
8
9
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、 調用“合適”的方法

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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");
  }
 }

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

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

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

?
1
2
3
4
5
6
7
8
9
10
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. 如果重載方法里有兩個不同的類型的參數,即使兩者沒有繼承關系,編譯器也會判斷不了到底調用哪個。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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");
  }
 }

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

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

?
1
Printer.print((App)null);

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品一区二区三区久久 | 欧美摸胸 | 男人搡女人视频免费看 | free嫩白的12sex性自由 | 亚洲精品一区二区三区在线看 | 日韩欧美一区黑人vs日本人 | 护士被多人调教到失禁h | 国产乱插 | 午夜国产精品影院在线观看 | 无码人妻丰满熟妇啪啪网不卡 | 国产夜趣福利第一视频 | 国产区成人综合色在线 | 成人福利在线视频免费观看 | 欧美一级特黄特色大片免费 | 国产精品嫩草影院在线看 | 99在线免费视频 | 国产成人精品免费视频软件 | 九九久久国产精品免费热6 九九精品视频一区二区三区 | 二区三区在线观看 | 久久精品热在线观看30 | 99久久精品免费看国产情侣 | 国产精品理论片在线观看 | 天天夜夜草草久久伊人天堂 | 亚洲精品第一国产综合 | 女人被爽到呻吟娇喘的视频动态图 | 范冰冰上面好大下面好紧 | 女子监狱第二季在线观看免费完整版 | 日本一区二区精品88 | 国产日韩视频一区 | 果冻传媒林予曦图片 | 欧美男同videos | 日本福利网 | 国产-第1页-草草影院 | 日韩经典在线观看 | 亚洲免费视频播放 | 日本一区二区三区久久精品 | 四虎影视地址 | 国产精品青青在线观看香蕉 | 国产福利一区二区三区四区 | 日韩一级片在线播放 | 天天av天天翘天天综合网 |