靜態、動態綁定機制--java11

我們發現經過常量池解析之后,JVM就能夠確定要調用的f1()方法具體在內存的什么位置上了。實際上,這個信息在編譯階段就已經在StaticCall類的常量池中記錄了下來。這種在編譯階段就能夠確定調用哪個方法的方式,我們叫做靜態綁定機制

很明顯,根據對象(father)的聲明類型(Father)還不能夠確定調用方法f1的位置,必須根據father在堆中實際創建的對象類型Son來確定f1方法所在的位置。這種在程序運行過程中,通過動態創建的對象的方法表來定位方法的方式,我們叫做動態綁定機制。(Java的動態綁定又稱為運行時綁定。)

總結:

(1) 所有私有方法、靜態方法、構造器及初始化方法都是采用靜態綁定機制。在編譯器階段就已經指明了調用方法在常量池中的符號引用,JVM運行的時候只需要進行一次常量池解析即可。

(2) 類對象方法的調用必須在運行過程中采用動態綁定機制。

首先,根據對象的聲明類型(對象引用的類型)找到“合適”的方法。具體步驟如下:

① 如果能在聲明類型中匹配到方法簽名完全一樣(參數類型一致)的方法,那么這個方法是最合適的。

② 在第①條不能滿足的情況下,尋找可以“湊合”的方法。標準就是通過將參數類型進行自動轉型之后再進行匹配。如果匹配到多個自動轉型后的方法簽名f(A)和f(B),則用下面的標準來確定合適的方法:傳遞給f(A)方法的參數都可以傳遞給f(B),則f(A)最合適。反之f(B)最合適。

③ 如果仍然在聲明類型中找不到“合適”的方法,則編譯階段就無法通過。

然后,根據在堆中創建對象的實際類型找到對應的方法表,從中確定具體的方法在內存中的位置。

http://www.cnblogs.com/devinzhang/archive/2011/12/27/2304056.html

區別對比

1.靜態綁定發生在編譯時期,動態綁定發生在運行時

2.使用private或static或final修飾的變量或者方法,使用靜態綁定。而虛方法(可以被子類重寫的方法)則會根據運行時的對象進行動態綁定。

3.靜態綁定使用類信息來完成,而動態綁定則需要使用對象信息來完成。

4.重載(Overload)的方法使用靜態綁定完成,而重寫(Override)的方法則使用動態綁定完成。


http://developer.51cto.com/art/201201/311537.htm

如果子類Son中定義了 method() 的方法,則直接調用子類中的相應方法;如果子類Son中沒有定義相應的方法,則到其父類中尋找method()方法。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容