抽象類和介面區別
抽象類:
一個類被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方法。