動態繫結與靜態繫結辨析

2021-09-06 16:36:36 字數 1282 閱讀 9021

使用父類型別儲存子類物件,返回父類屬性。使用子類型別儲存子類物件,返回子類屬性。這樣屬於靜態繫結

先定義兩個類:

class father

class son extends father

使用父類型別儲存乙個子類物件son1:

father son1=new son();

system.out.print(son1.age);

此時輸出的年齡為48,使用了父類的屬性。

使用子類型別儲存乙個子類物件son1:

son son2=new son();

system.out.print(son2.age);

此時輸出的結果為24,顯然使用了子類的屬性。

綜上屬性是屬於靜態繫結的,即屬於什麼型別就使用誰的屬性。

那麼使用父類儲存子類物件,訪問子類獨有屬性id,按照靜態繫結的定義來說,應該使用父類的該屬性,由於父類無此屬性,所以應當報錯才對。

顯然訪問了子類的id屬性,編譯不通過,問題為id不屬於此中的屬性。所以無法找到。

父類和子類都有同樣的方法 , 子類型別 儲存 子類物件  , 呼叫的方法是 子類 的方法。 父類和子類都有同樣的方法 , 父類型別 儲存 子類物件  , 呼叫的方法是 子類 的方法。這樣屬於動態繫結。

class father

}class son extends father

}

父類與子類中都定義了同樣的方法say(),建立的物件為son1,son2如上所示:

這兩個物件分別呼叫兩個方法:

son1.say();

son2.say();

執行的結果為:

全都是執行了子類的方法,屬於動態繫結,即根據物件而不是根據物件所屬型別來呼叫方法。

那麼呼叫靜態方法呢?

將say()屬性設定為static,執行結果為:

這個結果符合靜態繫結的定義,所以當方法為靜態方法時,採用的時靜態繫結。

動態繫結與靜態繫結

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

動態繫結與靜態繫結

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

java動態繫結與靜態繫結

首先需要了解方法的呼叫過程 1.編譯器檢視物件宣告型別與方法。假設呼叫x.f param 且隱式引數型別x宣告為c型別的物件。需要注意的是 可能存在多個名稱為f的方法,但是引數型別不一樣,例如f string f int 這時編譯器會列舉 出c類中方法名為f和c類的父類中修飾符為public的f方法...