通過前面幾篇文章的學習,初學者可以初步掌握Java語言中繼承的概念和使 用方法,對抽象類的使用也有一定的理解。值得注意的是,Java中類與類的繼承 是單繼承,也就是一個子類最多同時可以繼承一個父類。那麼讓我們看下面的例 子。
假設我們要開發一個游戲系統,而游戲系統中有三種飛行器:飛機、小鳥、 蜘蛛俠。這三種飛行器都需要實現起飛,飛行,降落的邏輯,但是實現方法各不 相同。那麼這三個類應該有一個抽象類作為父類,規范共同行為。
package com.csst.inter; public abstract class Flyer { public abstract void takeoff(); public abstract void fly(); public abstract void land(); } package com.csst.inter; public class SpiderMan extends Flyer { @Override public void fly() { // TODO Auto-generated method stub } @Override public void land() { // TODO Auto-generated method stub } @Override public void takeoff() { // TODO Auto-generated method stub } } // Plane,Bird省略
讓我們仔細看Flyer這個抽象類,它的特點是沒有具體方法,所有方法都是抽 象方法,而且沒有變量。而如果這時,SpiderMan類需要繼承另外一個父類,就 做不到了,因為Java語言中的繼承是單繼承的。而如果SpiderMan不繼承Flyer類 也不可以,因為所有飛行器都用Flyer類型來規范。正為了解決Java中單繼承的 問題,Java中有了接口的概念。我們可以如下修改上面代碼:
package com.csst.inter; public interface Flyer { public void takeoff(); public void fly(); public void land(); } package com.csst.inter; public class SpiderMan implements Flyer { public void fly() { // TODO Auto-generated method stub } public void land() { // TODO Auto-generated method stub } public void takeoff() { // TODO Auto-generated method stub } }
如果有一個父類SuperMan,SpiderMan可以同時繼承,如下:
package com.csst.inter; public class SpiderMan extends SuperMan implements Flyer { public void fly() { // TODO Auto-generated method stub } public void land() { // TODO Auto-generated method stub } public void takeoff() { // TODO Auto-generated method stub } }
可以說,接口就是一種特殊的抽象類,特殊就特殊在於所有方法都是抽象方 法,而且沒有變量。在Java中,一個類可以同時實現多個接口,也可以繼承類和 實現接口同時存在,如SpiderMan類所示。類實現接口後,需要覆蓋接口中的抽 象方法,否則該類必須聲明為抽象類。
接口和接口之間也可以繼承,且一個接口可以繼承多個接口,因為接口中的 方法都是抽象的。如下:
interface A{ //TBD } interface B{ //TBD } interface C extends A,B{ //TBD }
所以,所謂的單繼承,是指類與類之間的繼承,而接口與接口的繼承,是一 對多的,類實現接口,也是一對多的。