Java中abstract class和interface有什麼區別?進行了深入分析

Java中含有abstract修飾符的class即為抽象類,abstract類不能創建的實例對象;含有abstract方法的類必須定義為abstract class,abstract class類中的方法不必是抽象的。

abstract class類中定義抽象方法必須在具體(Concrete)子類中實現,所以,不能有抽象構造方法或抽象靜態方法。如果的子類沒有實現抽象父類中的所有抽象方法,那麼子類也必須定義為abstract類型。

介面(interface)可以說成是抽象類的一種特例,介面中的所有方法都必須是抽象的;介面中的方法定義默認為public abstract類型,介面中的成員變數類型默認為public static final。

Advertisements

網路配圖

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

1、抽象類可以有構造方法,介面中不能有構造方法。

2、抽象類中可以有普通成員變數,介面中沒有普通成員變數

3、抽象類中可以包含非抽象的普通方法,介面中的所有方法必須都是抽象的,不能有非抽象的普通方法。

4、抽象類中的抽象方法的訪問類型可以是public,protected和(默認類型,雖然eclipse下不報錯,但應該也不行),但介面中的抽象方法只能是public類型的,並且默認即為public abstract類型。

5、 抽象類中可以包含靜態方法,介面中不能包含靜態方法

6.、抽象類和介面中都可以包含靜態成員變數,抽象類中的靜態成員變數的訪問類型可以任意,但介面中定義的變數只能是public static final類型,並且默認即為public static final類型。

Advertisements

7.、一個類可以實現多個介面,但只能繼承一個抽象類。

網路配圖

下面接著再說說兩者在應用上的區別:

介面更多的是在系統架構設計方法發揮作用,主要用於定義模塊之間的通信契約;而抽象類在代碼實現方面發揮作用,可以實現代碼的重用,例如,模板方法設計模式是抽象類的一個典型應用,假設某個項目的所有Servlet類都要用相同的方式進行許可權判斷、記錄訪問日誌和處理異常,那麼就可以定義一個抽象的基類,讓所有的Servlet都繼承這個抽象基類,在抽象基類的service方法中完成許可權判斷、記錄訪問日誌和處理異常的代碼,在各個子類中只是完成各自的業務邏輯代碼,偽代碼如下:

public abstract classBaseServlet extends HttpServlet{

public final void service(HttpServletRequest request,HttpServletResponse response) throws IOExcetion,ServletException {

記錄訪問日誌

進行許可權判斷

if(具有許可權){

try{

doService(request,response);

}

catch(Excetpion e) {

記錄異常信息

}

}

}

protected abstract void doService(HttpServletRequest request,HttpServletResponse response) throws IOExcetion,ServletException;

//注意訪問許可權定義成protected,顯得既專業,又嚴謹,因為它是專門給子類用的

}

public class MyServlet1 extendsBaseServlet

{

protected voiddoService(HttpServletRequest request, HttpServletResponse response) throwsIOExcetion,ServletException

{

本Servlet只處理的具體業務邏輯代碼

}

}

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

網路配圖

最後總結 一下回答這個問題的思路,我們先從總體解釋抽象類和介面的基本概念,然後再比較兩者的語法細節,最後再說兩者的應用區別。

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

Advertisements

你可能會喜歡