? ? ? 含有abstract修飾符的class即為抽象類与斤,abstract類不能創(chuàng)建的實例對象。含有abstract方法的類必須定義為abstract class,abstract class類中的方法不必是抽象的。abstract class類中定義抽象方法必須在具體(Concrete)子類中實現(xiàn),所以沪曙,不能有抽象構(gòu)造方法或抽象靜態(tài)方法。如果的子類沒有實現(xiàn)抽象父類中的所有抽象方法萎羔,那么子類也必須定義為abstract類型液走。
接口(interface)可以說成是抽象類的一種特例,接口中的所有方法都必須是抽象的。接口中的方法定義默認(rèn)為public abstract類型缘眶,接口中的成員變量類型默認(rèn)為public static final嘱根。
下面比較一下兩者的語法區(qū)別:
1.抽象類可以有構(gòu)造方法,接口中不能有構(gòu)造方法巷懈。
2.抽象類中可以有普通成員變量该抒,接口中沒有普通成員變量
3.抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的顶燕,不能有非抽象的普通方法凑保。
4.?抽象類中的抽象方法的訪問類型可以是public,protected和(默認(rèn)類型,雖然
eclipse下不報錯涌攻,但應(yīng)該也不行)欧引,但接口中的抽象方法只能是public類型的,并且默認(rèn)即為public abstract類型恳谎。
5.?抽象類中可以包含靜態(tài)方法芝此,接口中不能包含靜態(tài)方法
6.?抽象類和接口中都可以包含靜態(tài)成員變量,抽象類中的靜態(tài)成員變量的訪問類型可以任意因痛,但接口中定義的變量只能是public static final類型婚苹,并且默認(rèn)即為public static final類型。
7.?一個類可以實現(xiàn)多個接口鸵膏,但只能繼承一個抽象類膊升。
? ? ? 兩者在應(yīng)用上的區(qū)別:
接口更多的是在系統(tǒng)架構(gòu)設(shè)計方法發(fā)揮作用,主要用于定義模塊之間的通信契約较性。而抽象類在代碼實現(xiàn)方面發(fā)揮作用用僧,可以實現(xiàn)代碼的重用结胀,例如赞咙,模板方法設(shè)計模式是抽象類的一個典型應(yīng)用,假設(shè)某個項目的所有Servlet類都要用相同的方式進(jìn)行權(quán)限判斷糟港、記錄訪問日志和處理異常攀操,那么就可以定義一個抽象的基類,讓所有的Servlet都繼承這個抽象基類秸抚,在抽象基類的service方法中完成權(quán)限判斷速和、記錄訪問日志和處理異常的代碼,在各個子類中只是完成各自的業(yè)務(wù)邏輯代碼剥汤,