1. 程式人生 > >抽象類和介面區別

抽象類和介面區別

抽象類:

一個類被abstract關鍵字修飾就是抽象類。

定義很簡短,可能會有很多朋友質疑,《java程式設計思想》中說含有抽象方法的類就是抽象類,我試了下只要用abstract修飾的都是抽象類,就算裡面不含有抽象方法,語法層面也是正確的。下面所有關於抽象類的總結都是基於抽象類含有抽象方法。

下面說一下抽象類的特點:

(1)抽象類由於含有抽象方法(未實現)所以無法例項化,需要被繼承

(2)繼承抽象類必須實現抽象類的抽象方法,除非繼承了抽象類的類還是一個抽象類,

(3)抽象類的抽象方法訪問修飾符必須為public或者protected,預設情況下和類不同預設為public  

(4)抽象類中的其他方法,變數和正常類沒有區別

介面:

被interface修飾(和android aidl區分)

 介面中可以含有變數和方法,變數會被隱式地指定為public static final,但一般情況不要在介面中定義變數,方法都是抽象的(jdk8函式式介面可以有實現方法),用private、protected、static、 final等修飾會報編譯錯誤。

介面特點:

(1)如果有變數都是public static final的

(2)方法都是抽象的,方法的預設訪問修飾符為public

(3)不能直接例項化使用,需要實現

(4)介面之間可以相互繼承

抽象類和介面的區別:

(1)抽象類中變數可以是正常型別的變數,介面中的變數只能是public static final

(2)介面中的方法都是抽象的,抽象類可以提供已經實現的

(3)一個類可以實現多個介面,只能實現一個抽象類

(4)介面中的方法只能是public,不能是static final等無法繼承實現,抽象類中的方法則沒有那麼多限制。

抽象類本質還是類,抽象類有點類似我們平時抽取的基類對共性進行抽取,可以作為經常使用的類的父類。

介面是更抽象的類(感覺輕量級),介面中的變數都是常量沒有討論價值,方法都是抽象的,更像是對行為的規範,要做什麼事都已經規定好,至於具體怎麼做每個人都不同。

總結:抽象類側重抽象,主要作為基類,寫好共性的功能屬性,留出抽象方法供實現;

介面側重行為,規定了要實現的所有方法,但所有的方法都是抽象的,是對行為的規範。

介面新特性

jdk8介面可以定義static和default方法。