abstract class和interface有什麼區別
阿新 • • 發佈:2019-02-18
abstract class與interface
abstract class | interface | |
---|---|---|
例項化 | 不能 | 不能 |
類 | 一種繼承關係,一類只能使用一次繼承關係。可以通過繼承多個介面實現多重繼承 | 一個類可以實現多個interface |
資料成員 | 可以有自己的 | 靜態的不能被修改即必須是static final,一般不在此定義 |
方法 | 可以私有的,非abstract方法,必須實現 | 不可私有的,預設是public ,abstract型別 |
變數 | 可有私有的,預設是friendly型,其值可以在子類中重新定義,也可以重新賦值 | 不可有私有的,預設是public static final型,且必須給其初值,實現類中不能重新定義,不能改變其值 |
設計理念 | 表示的是“is a”關係 | 表示對的是“like a”關係 |
實現 | 需要繼承,要用extends | 要用implement |
兩種的語法區別
1. 抽象類可以有構造方法,介面不能有構造方法
2. 抽象類中可以有普通成員變數,介面中沒有普通成員變數
3. 抽象類中可以包含非抽象的普通方法,介面中的所有方法必須是抽象的,不能有非抽象的普通方法
4. 抽象類中抽象方法的訪問型別可以是public,protected和預設型別雖然(eclipse下不報錯,但應該也不行),但介面中的抽象方法只能是public型別,並且預設即為public abstract型別
5. 抽象類中可以包含靜態方法,介面中不能包含靜態方法
6. 抽象類和介面中都可以包含靜態成員變數,抽象類中的靜態成員變數的訪問型別可以任意,但介面中定義的變數只能是public static final型別,並且預設即為public static final型別
7. 一個類可以實現多個介面,但只能繼承一個抽象類
兩者在應用上的區別
介面更多的是在系統架構設計方法發揮作用,主要用於定義模組之間的通訊契約。而抽象類在程式碼實現方面發揮作用,可以實現程式碼的重用,例如,模組方法模式是抽象類的一個典型應用:
假設某個專案的所有Servlet類都要用相同的方式進行許可權判斷、記錄訪問日誌和處理異常的程式碼,在各個子類中完成各自的業務邏輯程式碼,虛擬碼如下:
public abstract class BaseServlet extends HttpServlet {
@Override
protected final void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
//記錄訪問日誌
//進行許可權判斷
if (/*具有許可權*/) {
try{
doService(request,response);
}
catch(Exception e){
//記錄異常資訊
}
}
}
protected abstract void doService(HttpServletRequest request, HttpServletResponse response)throws IOException,ServletException {
// TODO Auto-generated method stub
//注意訪問許可權定義成protected,這樣顯得即專業,有嚴謹,是專門給子類用的
}
}
public class MyServlet extends BaseServlet{
@Override
protected void doService(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
// TODO Auto-generated method stub
//該Servlet只處理具體的業務邏輯程式碼
}
}
父類方法中間的某段程式碼不確定,留給子類幹,就用模板方法設計模式。