1. 程式人生 > >abstract class和interface有什麼區別

abstract class和interface有什麼區別

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只處理具體的業務邏輯程式碼
    }
}

父類方法中間的某段程式碼不確定,留給子類幹,就用模板方法設計模式。