通過前面幾篇文章的學習,初學者可以初步掌握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
}
所以,所謂的單繼承,是指類與類之間的繼承,而接口與接口的繼承,是一 對多的,類實現接口,也是一對多的。