方法調(diào)用不等同方法執(zhí)行谣妻,唯一任務就是確定調(diào)用方法的版本(即調(diào)用哪一個方法)鳞滨。Class文件編譯過程中不包含傳統(tǒng)編譯中的連接步驟累盗,一切方法調(diào)用在Class文件里面存儲的都只是符號引用寒矿,而不是內(nèi)存的入口地址(直接引用)。需要在類加載期間若债,甚至到運行期間才能確定目標方法的直接引用符相。
解析
所有方法調(diào)用中的目標方法在Class文件里面都是一個常量池中的符號引用,在類加載的解析階段蠢琳,會將其中的一部分符號引用轉(zhuǎn)化為直接引用啊终,前提是:方法在程序真正運行之前就有一個可確定的調(diào)用版本,并且在運行期間是不可變的傲须。符合這個前提的方法有:
1蓝牲、靜態(tài)方法:與類直接關(guān)聯(lián)
2、私有方法:在外部不可被訪問
兩類方法都不可能通過繼承或別的方式重寫版本泰讽,它們都適合在類加載階段進行解析例衍。
解析調(diào)用一定是個靜態(tài)過程,在編譯期間就完全確定已卸,在類加載的解析階段就會轉(zhuǎn)化為直接引用佛玄,不會延遲到運行期間完成。
分派
靜態(tài)分派
所有依賴靜態(tài)類型來定位方法執(zhí)行版本的分派動作稱為靜態(tài)分派咬最。靜態(tài)分派的典型應用是方法重載翎嫡。靜態(tài)分派發(fā)生在編譯階段。
動態(tài)分派
在運行期間根據(jù)實際類型確定方法執(zhí)行版本的分派過程稱為動態(tài)分派永乌,動態(tài)分派的典型應有有方法重寫惑申。