天天看點

Java007 Java多态-後期綁定何為綁定?前期/靜态/編譯時綁定後期/動态/運作時綁定

何為綁定?

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

前期/靜态/編譯時綁定

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

後期/動态/運作時綁定

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

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

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

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