是一個(is-a)與像是一個(is-like-a)關係函數
有時你必須在導處類型中添加新的接口元素,這樣也就擴展了接口並建立了新的類型。這個新的類型仍然能夠替代基類,可是這種替代並不完美,由於基類沒法訪問你新添加的方法。這種狀況咱們能夠描述爲「is-like-a」關係。工具
伴隨多態的可互換對象spa
編譯器不可能產生傳統意義上的函數調用(function call)。一個非面向對象(non-OOP)編譯器產生的函數調用會引發所謂的「前期綁定(earlybinding)」。這麼作意味着編譯器將產生對一個具體函數名字的調用,而連接器(linker)將這個調用解析到將要被執行代碼的絕對地址(absolute address)。在OOP中,程序直到運行時刻纔可以肯定代碼的地址,因此當消息發送到一個泛化對象時,必須採用其餘的機制。爲了解決這個問題,面向對象程序設計語言使用了「後期綁定(latebinding)」的概念。當你向對象發送消息時,被調用的代碼直到運行時刻才能被肯定。編譯器確保被調用方法存在,並對調用參數(argument)和返回值(return value)執行類型檢查(沒法提供此類保證的語言被稱爲是弱類型的(weakly typed)),可是並不知道將會被執行的確切代碼。設計
爲了執行後期綁定,Java使用一小段特殊的代碼來替代絕對地址調用。這樣,根據這一小段代碼的內容,每個對象均可以具備不一樣的行爲表現。當你向一個對象發送消息時,該對象就可以知道對這條消息應該作些什麼。對象
在Java中,動態綁定是缺省行爲,你不須要添加額外的關鍵字來實現多態(polymorphism)。繼承
將導出類看做是它的基類的過程稱爲「向上轉型(upcasting)」接口
抽象基類和接口編譯器
基類僅僅表示其導出類的接口,也就是說,你不但願任何人建立基類的實際對象,而只是但願他們將對象向上轉型到基類,因此它的接口將派上用場。這是經過使用abstract關鍵字把類標識成爲抽象類來實現的。若是有人試圖建立一個抽象類的對象,編譯器都會加以阻止。抽象方法只能在抽象類內部建立,當該類被繼承時,抽象方法必須被實現,不然繼承類仍然是一個抽象類。建立抽象方法使得你能夠將一個方法置於接口中而沒必要被迫爲此方法提供可能毫無心義的方法體。io
Interface(接口)這個關鍵字比抽象類的概念更進了一步,它壓根不容許有任何方法定義。接口是一個很是方便而通用的工具,由於它提供了接口與實現的完美分離。此外,只要你願意,你就能夠將多個接口組合到一塊兒,與之相對照的,你要繼承多個通常類或抽象類倒是不可能的。編譯