真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:主機域名、雅安服務(wù)器托管、營銷軟件、網(wǎng)站建設(shè)、和靜網(wǎng)站維護、網(wǎng)站推廣。

1、靜態(tài)分派

所有依賴靜態(tài)類型來定位方法執(zhí)行版本的分派動作稱為靜態(tài)分派。靜態(tài)分派的典型應(yīng)用是方法重載。靜態(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)分派一詞實際上是中文翻譯特有的,國外的技術(shù)文檔都是將其稱為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");
  }
 }

當(dāng)調(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)先),父類(在繼承關(guān)系中從下往上找,越接近上層的優(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ù),即使兩者沒有繼承關(guān)系,編譯器也會判斷不了到底調(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");
  }
 }

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

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

Printer.print((App)null);

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

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


網(wǎng)頁標(biāo)題:JVM方法調(diào)用之靜態(tài)分派(詳解)
網(wǎng)頁鏈接:http://weahome.cn/article/gjihoj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部