1.編譯器查看對象的聲明對象和方法名。如x.f(args)
語句,假設隱式參數x聲明為C類對象。這時編譯器一一列舉所有C類中名為f的方法和其超類中訪問屬性為public且名為f的方法。
2.編譯器查看調用方法時提供的參數類型。這個過程稱為重載解析。
3.如果是private、static、final方法或者構造器,那么編譯器就可以准確知道地知道調用哪個方法,這種調用方式稱為靜態綁定。如果不是這幾種情況,就采用動態綁定,執行下面過程。
4.當程序運行時,並且采用動態綁定調用方法時,虛擬機一定調用與x所引用對象是實際類型最適合的那個類的方法。假設x的實際類型是D,它是C類的子類。那么虛擬機會先在D類中尋找符合的方法,否則將在D類的超類中尋找,以此類推。
注意:如果每次調用方法都要進行搜索,時間開銷會變得很大,所以虛擬機預先為每個類創建了一張方法表,其中列出了所有方法的簽名(方法名和參數列表)和實際調用的方法。
5.調用方法。