本文旨在討論什麼時候使用抽象類別,什麼時候使用介面。
抽象類別(Abstract):
我們知道Java物件導向編程中有繼承的概念,當有的父類我們不希望可以建立其執行個體的時候就要用到抽象類別。比如三角形、圓形、正方形的的父類都為“形狀”,我們可以建立三角形、圓形和正方形的執行個體,但是不希望建立“形狀”的執行個體,因為形狀是不存在的,這個時候就要用到抽象的方法定義“形狀”。
abstract class Shape{ abstract void draw(); abstract void erase();}
值得注意的是:如果一個類有了一個抽象的方法,這個類就必須聲明為抽象類別。如果父類是抽象類別,那麼子類就必須覆蓋所有在父類中的抽象方法,否則子類也將成為一個抽象類別。
抽象類別就是為了避免製造出這個類的對象而設計的。
介面(Interface):
Java把抽象的概念又更推進了一步,這就是介面,介面其實就是完全抽象的類。我們知道介面與抽象類別的區別就是介面中所有的方法都是沒有方法體的,而且都是public abstract類型的,介面中所有的成員變數都是public static final 的變數,並且必須經過定義初始化。
interface Shape{ void draw(); void erase();}
OK,抽象類別與介面已經簡單的介紹完了,我想大部分人肯定跟我一樣還是沒有明白這兩個到底有什麼使用上的區別!
下面我來總結一下:
1.抽象類別和介面在某種程度上的確可以相互替換,比如上面這個例子。
2.抽象類別只能被繼承,且子類只能繼承一個,而介面可以實現很多個。
3.如何選擇使用抽象類別還是介面取決於程式的設計,下面舉個執行個體:
我們要實現一個“門”,其子類有木門,鐵門,玻璃門:
我們用抽象類別實現:
abstract class Door{ abstract void open(); abstract void close();}
也可以用介面實現:
interface Door{ void open(); void close();}
現在老闆提出我們應該生產防盜門,並且安裝在鐵門和玻璃門上。
這個時候就會有個alarm()方法,但是顯然alarm方法實現在Door抽象類別中是不合理的,因為不是所有的門都有該方法。
在每個子類中添加alarm()方法也不合適,所以這個時候就應該使用介面,我們把程式重新設計一下:
abstract class Door{ abstract void open(); abstract void close();}
interface Alarm { void alarm();}
class AlarmDoor extends Door implements Alarm { void open() { … } void close() { … } void alarm() { … }}
這樣就完美了,如果老闆現在讓我們給木門和鐵門加裝貓眼的功能,只需要設計一個貓眼的介面就行了。
現在知道什麼時候用抽象類別什麼時候用介面了嗎?