面試題思考:interface和abstract的區別

抽象類(abstract)java

含有abstract修飾符的class即爲抽象類,abstract 類不能建立的實例對象。設計模式

含有abstract方法的類必須定義爲abstract class,abstract class類中的方法沒必要是抽象的。架構

abstract class類中定義抽象方法必須在具體(Concrete)子類中實現,因此,不能有抽象構造方法或抽象靜態方法。eclipse

若是的子類沒有實現抽象父類中的全部抽象方法,那麼子類也必須定義爲abstract類型。spa

接口(interface)架構設計

interface 能夠說成是抽象類的一種特例,接口中的全部方法都必須是抽象的。設計

接口中的方法定義默認爲public abstract類型,接口中的成員變量類型默認爲public static final日誌

下面比較一下二者的語法區別:code

1.抽象類能夠有構造方法,接口中不能有構造方法。對象

2.抽象類中能夠有普通成員變量,接口中沒有普通成員變量

3.抽象類中能夠包含非抽象的普通方法,接口中的全部方法必須都是抽象的,不能有非抽象的普通方法。

4. 抽象類中的抽象方法的訪問類型能夠是public,protected和(默認類型,雖然eclipse下不報錯,但應該也不行),但接口中的抽象方法只能是public類型的,而且默認即爲public abstract類型。

5. 抽象類中能夠包含靜態方法,接口中不能包含靜態方法

6. 抽象類和接口中均可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型能夠任意,但接口中定義的變量只能是public static final類型,而且默認即爲public static final類型。

7. 一個類能夠實現多個接口,但只能繼承一個抽象類。

下面接着再說說二者在應用上的區別:

    接口更多的是在系統架構設計方法發揮做用,主要用於定義模塊之間的通訊契約。

 而抽象類在代碼實現方面發揮做用,能夠實現代碼的重用.

例如,模板方法設計模式是抽象類的一個典型應用,

假設某個項目的全部Servlet類都要用相同的方式進行權限判斷、記錄訪問日誌和處理異常,那麼就能夠定義一個抽象的基類,讓全部的Servlet都繼承這個抽象基類,

在抽象基類的service方法中完成權限判斷、記錄訪問日誌和處理異常的代碼,在各個子類中只是完成各自的業務邏輯代碼,僞代碼以下:

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public abstract class BaseServlet extends HttpServlet {

    public final void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        //記錄訪問日誌
        // 進行權限判斷
        if (具備權限) {
            try {
                doService(request, response);
            } catch (Exception e) {
                記錄異常信息
            }
        }
    }
    // 注意訪問權限定義成protected,顯得既專業,又嚴謹,由於它是專門給子類用的
 protected abstract void doService(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException;
}

 

子類:

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyServlet1 extends BaseServlet {
    protected void doService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        本Servlet只處理的具體業務邏輯代碼
    }
}

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

備註:這道題的思路是先從整體解釋抽象類和接口的基本概念,而後再比較二者的語法細節,最後再說二者的應用區別。

比較二者語法細節區別的條理是:先從一個類中的構造方法、普通成員變量和方法(包括抽象方法),靜態變量和方法,繼承性等6個方面逐一去比較回答,接着從第三者繼承的角度的回答,特別是最後用了一個典型的例子來展示本身深厚的技術功底。

相關文章
相關標籤/搜索