本文出自與:heipai:tsg666
含有 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 方法中完成權限判斷、記錄訪問日志和處理異常的代碼,在各個子類中只是完成各自的業務邏輯代碼,偽代碼如下:
1 public abstract class BaseServlet extends HttpServlet{ 2 3 public final void service(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException { 4 5 記錄訪問日志 6 7 進行權限判斷 8 9 if(具有權限){ 10 11 try{ 12 13 doService(request,response); 14 15 }catch(Excetpion e) { 16 17 記錄異常信息 18 19 } 20 21 } 22 23 } 24 25 protected abstract void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException{ 26 27 //注意訪問權限定義成protected,顯得既專業,又嚴謹,因為它是專門給子類用的 28 29 } 30 }
1 public class MyServlet1 extends BaseServlet{ 2 3 protected void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException{ 4 5 本Servlet只處理的具體業務邏輯代碼 6 7 } 8 9 }
父類方法中間的某段代碼不確定,留給子類干,就用模板方法設計模式。
備注:這道題的思路是先從總體解釋抽象類和接口的基本概念,然后再比較兩者的語法細節,最后再說兩者的應用區別。
比較兩者語法細節區別的條理是:
?????? 先從一個類中的構造方法、普通成員變量和方法(包括抽象方法),靜態變量和方法,繼承性等
????? 6 個方面逐一去比較回答,接著從第三者繼承的角度的回答,
???? 特別是最后用了一個典型的例子來展現自己深厚的技術功底。