1. 程式人生 > >Java中的方法呼叫過程分析

Java中的方法呼叫過程分析

假設呼叫x.f(args),隱式引數x宣告為類C的一個例項物件:

1.編譯器檢視物件的宣告型別和方法名。例如,可能存在方法f(int)和方法f(String)。編譯器將會一一列舉出所有該類中名為f的方法和其超類中訪問屬性為public且名為f的方法。

2.編譯器將檢視呼叫方法時提供的引數型別。如果在所有名為f的方法中存在一個與提供的引數型別完全匹配,就選擇這個方法。這個過程稱為過載解析

3.如果是private方法、static方法、final方法或者構造器,那麼編譯器將可以準確地知道應該呼叫哪個方法,這種方法稱為靜態繫結。與此對應的,呼叫的方法依賴於隱式引數的實際型別,並且在執行時才動態繫結

4.當程式執行時,並且採用動態繫結的方式,虛擬機器一定呼叫與x所引用物件的實際型別最合適的那個類的方法。假設x的實際型別為D,它是C類的子類。如果D類定義了方法f(String),就直接呼叫它;否則,在其父類中找到f(String),以此例推。每次呼叫方法,虛擬機器預先為每個類建立了一個方法表,其中列出了所有方法的簽名和實際呼叫的方法。在真正呼叫方法時,虛擬機器僅僅查詢這個表。

 

虛擬機器執行過程:

呼叫e.getSalary()的解析過程:

1.首先,虛擬機器提取e的實際型別的方法表。

2.虛擬機器搜尋定義getSalary簽名的類。

3.虛擬機器呼叫方法。