使用父類型別儲存子類物件,返回父類屬性。使用子類型別儲存子類物件,返回子類屬性。這樣屬於靜態繫結
先定義兩個類:
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方法...