Java007 Java多態-後期綁定

何爲綁定?

綁定指的是一個方法調用與方法所在類(方法主體)關聯起來。

前期/靜態/編譯時綁定

若在程序執行前進行綁定(如果有的話,由編譯器和連接程序實現),叫做前期/靜態/編譯時綁定。前期綁定是面向過程語言中默認的綁定方式。這麼做意味着編譯器將產生對一個具體函數名字的調用,而運行時將這個調用解析到將要被執行的代碼的絕對地址(爲何能將調用解析到將要被執行的代碼的絕對地址?因爲:前期綁定,在程序運行前的編譯期間就已將方法調用與方法主體關聯起來了)。然而在OOP(Oriented-Object Programming)中,程序直到運行時才能夠確定代碼的地址,所以當消息發送到一個泛化對象時,必需採用其他機制(方法調用機制:在運行時判斷對象的具體類型,從而調用恰當的方法,找到正確的方法執行主體。後期綁定機制隨編程語言的不同而有所不同,但無論如何都必須在對象中安置某種“類型信息”)。

後期/動態/運行時綁定

面向對象程序設計語言使用了後期/動態/運行時綁定的概念。當向對象發送消息時,被調用的方法的代碼直到運行時才能確定。編譯器確保被調用方法的存在,並對被調用參數和返回值執行類型檢查(無法提供此類保證的語言被稱爲是弱類型的),但是並不知道將要被執行的確切代碼。

爲了執行後期綁定,Java使用一小段特殊的代碼來代替絕對地址調用。這段代碼使用在對象中存儲的信息來計算方法體的地址。這樣,根據這一小段代碼的內容,每一個對象都可以具有不同的行爲表現。當向一個對象發送消息時,該對象就能夠知道這條消息應該做些什麼。後期綁定在運行時根據具體對象類型進行綁定。

Java中static方法、final方法(private方法屬於final方法)屬於前期綁定,子類無法重寫final方法。成員變量(包括靜態/非靜態)也屬於前期綁定,除了static和final之外的其他方法屬於後期綁定。

有了後期綁定,當向一個對象發送消息時,即使涉及向上轉型(一個面向對象程序肯定會在某處包含向上轉型(upcasting,靈感來源於模型鑄造的塑模動作,而向上up這個詞來源於繼承圖的典型佈局方式:通常基類在頂部,而導出類在其下部散開,因此,轉型爲一個基類就是在繼承圖中向上移動,即“向上轉型”),因爲這正是將自己從必需知道確切類型的限定中解放出來的關鍵),該對象也只知道要執行什麼樣的正確行爲。

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