java動態綁定與靜態綁定

首先需要了解方法的調用過程:

1.編譯器查看對象聲明類型與方法。假設調用x.f(param),且隱式參數類型X聲明爲C類型的對象。

需要注意的是:可能存在多個名稱爲f的方法,但是參數類型不一樣,例如f(String),f(int),這時編譯器會列舉

出C類中方法名爲f和C類的父類中修飾符爲public的f方法,到此爲止,編譯器已經找到所有可能被調用的方法。

2.查看方法調用時提供的參數類型。如果所有名爲f的方法中存在一個與提供參數相匹配的的方法,例如x.f(“hello”)

那麼編譯器就會查找f(String),而不是f(int).此過程如果找到多個此方法或者沒有找到,就會報錯。


靜態綁定:

在編譯期就準確知道調用的是哪一個方法。如果是private方法,static方法,final方法或者是構造器,那麼就可以直接確定是調用那個方法。

private方法:只能是本類中的方法,因爲private方法對子類不可見

static方法:是類方法,可以被繼承,但是不能被重寫

final方法:不能被繼承,因此會直接確定


動態綁定:

調用的方法依賴於隱式參數的類型,例如x.f()中x的類型,只能在運行期進行綁定。這時候就是動態綁定。通俗說就是不知道X是什麼類型的。

每次方法調用時,都會對X類和X類的父類列出一個方法表,每次方法在調用的時候在方法表中進行尋找,因爲不確定到底調用的是X類的方法還是X父類的方法。


說明:如果一個方法很假單並且沒有被覆蓋,編譯器就會對此代碼進行優化,這個過程爲“內聯”

例如:內聯調用e.getName會被替換爲e.name.如果被覆蓋,那麼就不確定調用方法是哪個,因此就不會進行優化




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章