程序運行時,jvm會根據用到的類名去找對應的.class文件,如果類發生了改變或者.class不存在,會進行編譯。
X x = new X();
x.f(int ss)
執行到new這行代碼,會查找X匹配的.class,然後查找X類,包括其超類中所有叫f的方法(叫f的方法可能重載了很多),鎖定要執行的方法的範圍。然後根據參數去匹配,這個叫重載解析
這個過程中,如果方法是private ,static,final,或者構造器,這些明確是屬於類自身的,可以快速找到調用位置,這叫靜態綁定
如果不是,那麼會去找跟x 對象類型最匹配的類的方法,比如自身有定義,或者重寫,就調用自身的,否則,去父類查找,如果沒有,繼續以此類推。這叫動態綁定。
動態綁定每次都要找,開銷比較大,jvm爲類預設了 method table方法表,每次去mehtod table去找就行了。
這裏有幾個概念:
1、編譯 .java --->.class,如果沒有.class或者.java有更新內容,編譯或重新編譯.class,加載到jvm中
2、重載解析 根據方法名,找到所有匹配的方法,然後根據參數找到要調用的方法
3、靜態綁定 如果是private ,staitic ,final方法 ,構造器,明確是屬於類本身的,可以快速找到
4、動態綁定,就需要從超類到自身找一遍(這樣開銷比較大,jvm預設了method table,),然後找最合適的執行(主要是看有沒有重寫,重寫過會執行重寫的)
靜態綁定的方法,是編譯時隨着類一起加載的,動態綁定的方法是需要在運行時通過多態的特性去確定的。