繼承可以被定義爲其中一個對象獲取的另一個特徵的過程。使用繼承的信息是在一個等級秩序作出管理。
當我們談到繼承,最常用的關鍵字是extends和implements。這些話會確定一個對象是否IS-A類型的另一個。通過使用這些關鍵字,我們可以使一個對象獲得另一個對象的屬性。
IS-A 關係:
IS-A(是一個)是一種表達:這個對象是一個類型的對象。讓我們來看看如何使用extends關鍵字來實現繼承。
public class Animal{}public class Mammal extends Animal{}public class Reptile extends Animal{}public class Dog extends Mammal{}
現在,根據上面的例子中,在面向對象的術語中,滿足下列條件:
動物是哺乳動物類的超類。
動物是爬蟲類的超類。
哺乳動物和爬行動物是動物類的子類。
狗是哺乳動物雙方和動物類的子類。
現在,如果我們考慮了IS-A關係,我們可以說:
哺乳動物IS-A 動物
爬行動物IS-A的動物
狗IS-A哺乳動物
因此:狗IS-A動物
使用extends關鍵字的子類就可以,除了超類的私有屬性外,它繼承超類的所有屬性。
我們可以保證,哺乳動物實際上是與使用實例操作符的動物。
例子:
public class Dog extends Mammal{ public static void main(String args[]){ Animal a = new Animal(); Mammal m = new Mammal(); Dog d = new Dog(); System.out.println(m instanceof Animal); System.out.println(d instanceof Mammal); System.out.println(d instanceof Animal); }}
這將產生以下結果:
truetruetrue
既然extends關鍵字讓我們研究如何使用implements關鍵字來獲得對IS-A關係有很好的理解。
implements關鍵字被使用的類從接口繼承。接口永遠不能憑藉它的類進行擴展。
例子:
public interface Animal {}public class Mammal implements Animal{}public class Dog extends Mammal{}
instanceof 關鍵字:
用instanceof操作符檢查確定哺乳動物是否實際上是一個動物,而狗實際上是一種動物
interface Animal{}class Mammal implements Animal{}public class Dog extends Mammal{ public static void main(String args[]){ Mammal m = new Mammal(); Dog d = new Dog(); System.out.println(m instanceof Animal); System.out.println(d instanceof Mammal); System.out.println(d instanceof Animal); }}
這將產生以下結果:
truetruetrue
HAS-A 關係:
這些關係主要是基於使用。這就決定了某一類是否 HAS-A 某一個東西。這種關係有助於減少重複代碼,以及錯誤。
讓我們研究一個例子:
public class Vehicle{}public class Speed{}public class Van extends Vehicle{ private Speed sp;}
這表明,Van類 HAS-A Speed類。通過讓飛車一個單獨的類,我們不必把屬於加速Van 類中的全部代碼。這使得它可以重複使用Speed類在多個應用程序。
在面向對象的功能,用戶無需理會哪個對象是做實際工作。要做到這一點,Van類隱藏用戶的執行細節。所以基本上會發生什麼是用戶會問Van類來執行某些動作,Van類要麼本身做的工作或要求另一個類執行的操作。
要記住的一個非常重要的事實是,Java只支持單一繼承。這意味着,一個類不能擴展多個類。因此,以下是非法的:
public class extends Animal, Mammal{}
因此,一個類可以實現一個或多個接口。這使得Java要擺脫多重繼承是不可能的。