Java繼承
繼承可以被定義為其中一個對象獲取的另一個特征的過程。使用繼承的信息是在一個等級秩序作出管理。
當我們談到繼承,最常用的關鍵字是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); } }
這將產生以下結果:
true true true
既然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); } }
這將產生以下結果:
true true true
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要擺脫多重繼承是不可能的。