含有abstract修飾符的class即為抽象類,abstract 類別不能建立的實例物件。含有abstract方法的類別必須定義為abstract class,abstract class類別中的方法不必是抽象的。 abstract class類別中定義抽象方法必須在具體(Concrete)子類別中實現,所以,不能有抽象建構方法或抽象靜態方法。如果的子類別沒有實作抽象父類別中的所有抽象方法,那麼子類別也必須定義為abstract類型。
介面(interface)可以說成是抽象類別的一種特例,介面中的所有方法都必須是抽象的。介面中的方法定義預設為public abstract類型,介面中的成員變數類型預設為public static final。
下面比較一下兩者的語法差異:
1.抽象類別可以有建構方法,介面中不能有建構方法。
2.抽象類別中可以有普通成員變量,介面中沒有普通成員變量
3.抽象類別中可以包含非抽象的普通方法,介面中的所有方法必須都是抽象的,不能有非抽象的普通方法。
4. 抽象類別中的抽象方法的存取類型可以是public,protected和(預設類型,雖然
eclipse下不報錯,但應該也不行),但介面中的抽象方法只能是public型別的,而且預設為public abstract型別。
5. 抽象類別中可以包含靜態方法,介面中不能包含靜態方法
6. 抽象類別和介面中都可以包含靜態成員變量,抽象類別中的靜態成員變數的存取類型可以任意,但介面中定義的變數只能是public static final類型,並且預設為public static final類型。
7. 一個類別可以實作多個接口,但只能繼承一個抽象類別。
下面接著再說說兩者在應用上的差異:
介面更多的是在系統架構設計方法發揮作用,主要用於定義模組之間的通訊契約。而抽象類別在程式碼實作方面發揮作用,可以實現程式碼的重用,例如,範本方法設計模式是抽象類別的典型應用,假設某個專案的所有Servlet類別都要用相同的方式進行權限判斷、記錄訪問日誌和處理異常,那麼就可以定義一個抽象的基類,讓所有的Servlet都繼承這個抽象基類,在抽象基類的service方法中完成權限判斷、記錄訪問日誌和處理異常的代碼,在各個子類別中只是完成各自的業務邏輯程式碼,偽代碼如下: