標籤:class http ext os 類 代碼
含有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 方法中完成許可權判斷、記錄訪問日
志和處理異常的代碼,在各個子類中只是完成各自的商務邏輯代碼,虛擬碼如下:
public abstract class BaseServlet 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 extends BaseServlet
{
protected void doService(HttpServletRequest request, HttpServletResponse response) throws
IOExcetion,ServletException
{
本Servlet 只處理的具體商務邏輯代碼
}
}
父類方法中間的某段代碼不確定,留給子類幹,就用模板方法設計模式。