java動態繫結與靜態繫結

2021-08-18 07:36:32 字數 854 閱讀 8720

首先需要了解方法的呼叫過程:

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.如果被覆蓋,那麼就不確定呼叫方法是哪個,因此就不會進行優化

動態繫結與靜態繫結

為了支援c 的多型性,才用了動態繫結和靜態繫結。理解他們的區別有助於更好的理解多型性,以及在程式設計的過程中避免犯錯誤。需要理解四個名詞 1 物件的靜態型別 物件在宣告時採用的型別。是在編譯期確定的。2 物件的動態型別 目前所指物件的型別。是在執行期決定的。物件的動態型別可以更改,但是靜態型別無法更...

動態繫結與靜態繫結

對指標來說 動態型別與靜態型別 動態型別是所指向的物件型別,這發生在程式執行期,靜態型別是宣告時指標時候,指標本身的型別,這發生在編譯期 所以說靜態型別宣告好後就不發生改變了,動態型別,可以執行改變,也就是允許指向不同的物件型別 如 基類classa 子類 class b publica pa靜態型...

C 動態繫結與靜態繫結

為了支援c 的多型性,才用了動態繫結和靜態繫結。理解他們的區別有助於更好的理解多型性,以及在程式設計的過程中避免犯錯誤。需要理解四個名詞 1 物件的靜態型別 物件在宣告時採用的型別。是在編譯期確定的。2 物件的動態型別 目前所指物件的型別。是在執行期決定的。物件的動態型別可以更改,但是靜態型別無法更...