就其本身來說,對象的概念可為我們帶來極大的便利。它在概念上允許我們將各式各樣數據和功能封裝到一起。這樣便可恰當表達“問題空間”的概念,不用刻意遵照基礎機器的表達方式。在程序設計語言中,這些概念則反映為具體的數據類型(使用class關鍵字)。
我們費盡心思做出一種數據類型後,假如不得不又新建一種類型,令其實現大致相同的功能,那會是一件非常令人灰心的事情。但若能利用現成的數據類型,對其進行“克隆”,再根據情況進行添加和修改,情況就顯得理想多了。“繼承”正是針對這個目標而設計的。但繼承並不完全等價於克隆。在繼承過程中,若原始類(正式名稱叫作基礎類、超類或父類)發生了變化,修改過的“克隆”類(正式名稱叫作繼承類或者子類)也會反映出這種變化。在Java語言中,繼承是通過extends關鍵字實現的
使用繼承時,相當於創建了一個新類。這個新類不僅包含了現有類型的所有成員(盡管private成員被隱藏起來,且不能訪問),但更重要的是,它復制了基礎類的接口。也就是說,可向基礎類的對象發送的所有消息亦可原樣發給衍生類的對象。根據可以發送的消息,我們能知道類的類型。這意味著衍生類具有與基礎類相同的類型!為真正理解面向對象程序設計的含義,首先必須認識到這種類型的等價關系。
由於基礎類和衍生類具有相同的接口,所以那個接口必須進行特殊的設計。也就是說,對象接收到一條特定的消息後,必須有一個“方法”能夠執行。若只是簡單地繼承一個類,並不做其他任何事情,來自基礎類接口的方法就會直接照搬到衍生類。這意味著衍生類的對象不僅有相同的類型,也有同樣的行為,這一後果通常是我們不願見到的。
有兩種做法可將新得的衍生類與原來的基礎類區分開。第一種做法十分簡單:為衍生類添加新函數(功能)。這些新函數並非基礎類接口的一部分。進行這種處理時,一般都是意識到基礎類不能滿足我們的要求,所以需要添加更多的函數。這是一種最簡單、最基本的繼承用法,大多數時候都可完美地解決我們的問題。然而,事先還是要仔細調查自己的基礎類是否真的需要這些額外的函數。