在Java中,使用抽象類來實現接口,並非毫無做用。相反,有時間有很大的做用。 程序員
當你只想實現接口中的個別方法(不是全部方法)時,你能夠先寫一個抽象類來實現該接口,並實現除了你想要的方法以外的全部方法(方法體爲空)。接着再用你的類繼承這個抽象類,這個類中就只用實現你須要的方法了,這樣就能夠達到你的須要了。可是,若是你直接實現接口的話,你就須要實現接口的全部方法。 spa
經過下面例子,能夠很好的理解: 設計
例:有一個接口ListModel,有四個方法,addListDataListener(ListDataListener l),getElementAt(int index),getSize(),removeListDataListener(ListDataListener l)四個方法,程序員在設計頁面時只關注對其返回指定索引處的值和返回列表的長度(getElementAt(int index)和getSize()),因此他只須要實現getElementAt(int index)和getSize()這兩個方法,而其他兩個不用實現。則設計以下: 繼承
//接口 索引
interface ListModel{ 接口
public void addListDataListener(ListDataListener l); rem
public Object getElementAt(int index); get
public int getSize(); class
public void removeListDataListener(ListDataListener l) 擴展
}
/**
*抽象類,不實現須要的方法。而實現的不須要的方法的方法體設爲空,
*/
abstract class AbstractListModel implements ListModel{
public void addListDataListener(ListDataListener l) {
listenerList.add(ListDataListener.class, l);
}
public void removeListDataListener(ListDataListener l) {
listenerList.remove(ListDataListener.class, l);
}
}
/**
* 具體實現類,實現特定的方法,該類中只有須要的方法
*/
public class MyListModel extends AbstractListModel {
public Object getElementAt(int index){
//XXXXXXXXXXX
}
public int getSize() {
//XXXXXXXXXXXXXXX
}
}
總結:抽象類有個好處就是,它能夠有方法的具體實現,也能夠不寫方法的具體實現,而接口裏是沒有具體實現的。
一個類若是實現一個接口,那它必然要實現接口裏的全部方法,而若是是擴展一個抽象類的話,子類裏能夠什麼都不寫或只寫部分。