任何不談使用方法的空理論都是耍流氓html
· 若是你擁有一些方法而且想讓它們中的一些有默認實現,那麼使用抽象類吧(Java1.8中接口也能夠這麼作了)java
· 若是你想實現多重繼承,那麼你必須使用接口。因爲Java不支持多繼承,子類不可以繼承多個類,但能夠實現多個接口。所以你就可使用接口來解決它。設計模式
· 若是基本功能在不斷改變,那麼就須要使用抽象類。若是不斷改變基本功能而且使用接口,那麼就須要改變全部實現了該接口的類。架構
· 接口更多的是在系統架構設計方法發揮做用,主要用於定義模塊之間的通訊契約spa
· 而抽象類在代碼實現方面發揮做用,能夠實現代碼的重用。架構設計
例如,模板方法設計模式是抽象類的一個典型應用,假設某個項目的全部Servlet類都要用相同的方式進行權限判斷、記錄訪問日誌和處理異常,那麼就能夠定義一個抽象的基類,讓全部的Servlet都繼承這個抽象基類,在抽象基類的service方法中完成權限判斷、記錄訪問日誌和處理異常的代碼,在各個子類中只是完成各自的業務邏輯代碼設計
總結:日誌
抽象類和接口的不一樣點主要存在在三個方面:htm
· 默認實現繼承
· 多重繼承
· 需求穩定性
參數 |
抽象類 |
接口 |
默認的方法實現 |
它能夠有默認的方法實現 |
接口徹底是抽象的。它根本不存在方法的實現(java1.8能夠實現了) |
實現 |
子類使用extends關鍵字來繼承抽象類。若是子類不是抽象類的話,它須要提供抽象類中全部聲明的方法的實現。 |
子類使用關鍵字implements來實現接口。它須要提供接口中全部聲明的方法的實現 |
構造器 |
抽象類能夠有構造器 |
接口不能有構造器 |
與正常Java類的區別 |
除了你不能實例化抽象類以外,它和普通Java類沒有任何區別 |
接口是徹底不一樣的類型 |
訪問修飾符 |
抽象方法能夠有public、protected和default這些修飾符 |
接口方法默認修飾符是public。你不可使用其它修飾符。 |
main方法 |
抽象方法能夠有main方法而且咱們能夠運行它 |
接口沒有main方法,所以咱們不能運行它。 |
多繼承 |
抽象方法能夠繼承一個類和實現多個接口 |
接口只能夠繼承一個或多個其它接口 |
速度 |
它比接口速度要快 |
接口是稍微有點慢的,由於它須要 時間去尋找在類中實現的方法。 |
添加新方法 |
若是你往抽象類中添加新的方法,你能夠給它提供默認的實現。所以你不須要改變你如今的代碼。 |
若是你往接口中添加方法,那麼你必須改變實現該接口的類(有時感受接口的這個特色特別煩) |
參數 |
抽象類 |
接口 |
普通方法 |
默認爲 public abstract |
|
靜態方法 |
能夠有 |
不能有 |
普通成員變量 |
能夠有 |
不能有 |
靜態成員變量 |
能夠有,修飾符任意 |
能夠有隻能是 public static final |
參考資料