Java基礎-抽象類和介面

Merbng發表於2018-05-17
  • 抽象類:對一類事物的抽象

定義: 如果一個類中沒有包含足夠多的資訊來描述一個具體的物件,這樣的類就是抽象類。

  • 介面:對某一行為的抽象

定義: 介面在java中是一個抽象型別,是抽象方法的集合。一個類通過實現介面的方式,從而繼承介面中的抽象方法。

抽象類的意義:

  1. 為子類提供一個公告的型別;
  2. 封裝子類中的重複內容(成員變數和方法)
  3. 定義有抽象的方法,子類雖然有不同的實現,但該方法的定義是一致的。

區別總結:

  1. 抽象類只能單繼承,介面能多實現。
  2. 抽象類是一個類,可以被任意許可權修飾符修飾,靜態和非靜態,final和非finl屬性。可以有抽象方法和非抽象方法;介面只能被public final 修飾,只能有靜態方法,即使沒有顯示的宣告,而且是不能修改的。
  3. 抽象的事物不同:

抽象類是對事物的抽象,介面是對行為的抽象;抽象類是對整個類的抽象,包括行為,屬性;介面是對類的行為(區域性)進行抽象。

  1. 定義的時候,定義抽象類和介面的思想不同:

設計抽象類是自下而上的過程,我子類需要,所以我定義抽象類;設計介面是自上而下的過程,我介面規範某一行為,我某類需要這個行為,我某類實現某介面。

  1. 抽象類可以有構造器,而介面不能有構造器。

核心區別:

    呼叫者使用的動機不同,實現介面 為了使用其他規範的某一個行為;

    繼承抽象類是為了使用這個類的屬性和行為 
複製程式碼

總結

  1. 抽象類和介面都不能直接例項化,若要例項化,抽象類變數必須指向實現所有的抽象方法的子類物件。介面變數必須指向實現所有介面方法的類物件。
  2. 抽象類要被子類繼承,介面要被類實現。
  3. 介面只能做方法申明,抽象類中可以做方法申明,也可以做方法實現。
  4. 介面裡定義的變數只能是公共的靜態的常量,抽象類中的變數是普通變數。
  5. 抽象類中抽象方法必須全部被子類實現,如果子類不能全部實現父類抽象方法,那麼 該子類只能是抽象類,同樣,一個實現介面的時候,如不能全部實現介面方法,那 麼該類也只能是抽象類。
  6. 抽象方法只能申明,不能實現,介面是設計的結果,抽象類是重構的結果。
  7. 抽象類裡可以沒有抽象方法。
  8. 如果一個類裡有抽象方法,那麼這個類一定是抽象類。
  9. 抽象方法要被實現,所以不能是靜態的。也不能是私有的。
  10. 介面可繼承介面,並可多繼承介面,但類只能單繼承。
  11. 抽象類主要用來抽象類別,介面主要用來抽象功能。
  12. 抽象類中,且不包含任何實現,派生類必須覆蓋他們,介面中的所有方法都必須是未實現的。

使用場景

再設計類時,如果有些方法我們能確定,而有些方法不能確定,這時候就可以定義成抽象類。抽象類的應用場景非常多,例如模板方法模式就是抽象類的一個應用,JDK中inputStream和outputStream也是抽象類的一個應用,這兩個類定義瞭如何讀寫資料的方法,而沒有定義從哪裡去讀,具體從哪裡讀是由具體的實現子類確定。

我們在定義相互呼叫規則時,可以使用介面,面向介面進行程式設計的好處,就是能極大地降低軟體系統的耦合性,介面的定義按照介面進行呼叫,而實現者去實現介面。 在JDK中存在很多針對介面的程式設計,例如用於我們比較兩個物件的Comparable介面就是一個典型的案例,我們在自定義物件時,如果實現了該介面,那麼我們把物件儲存到treeset集合中,treeset將針對介面呼叫物件的compareTo方法。

相關文章