抽象類和接口

感性上的區(qū)別 :
  • 抽象類,本質(zhì)上也是類,傾向于描述一個(gè)對(duì)象。如果你想要構(gòu)造的,更像是一個(gè)物體,就用抽象類。比如抽象工廠。
  • 接口,更傾向于作為 操作 的集合。比如業(yè)務(wù)接口。
理性上的區(qū)別(一部分):
  • 方法,接口的方法默認(rèn)都是 public abstract,抽象類的抽象方法不能是 private 和 static,其他方法沒有限制。
  • 屬性,接口中屬性默認(rèn)都是 public static final,而抽象類你就當(dāng)做普通類一樣想。
  • 抽象類可以沒有抽象方法(當(dāng)做一個(gè)普通類使用),接口里必須是抽象方法。
接口的屬性為什么必須是 public static final :
  • public接口就是為了給別人使用的,所以公開
  • static修飾的變量,跟隨接口的初始化就存在(參考類的初始化),所以它是屬于這個(gè)接口的。如果非 static ,就必須創(chuàng)建對(duì)象的時(shí)候才能有,但是接口不能實(shí)例化。
  • final修飾的變量一旦初始化不能被修改,防止實(shí)現(xiàn)類去修改它。Java是多實(shí)現(xiàn),多個(gè)實(shí)現(xiàn)類可以修改的話,屬性的值不好控制,與其放在接口中,還不如放在具體類
    中比較好。

備注:接口中屬性和方法,可以不加修飾符直接寫,但是我們通過 javap 反編譯一下就能看到

package com.xieyupeng.springboot;
public interface Test {

    int i = 0;

    void test1();

}
1.png
抽象類和接口類為什么都不能被實(shí)例化 :

實(shí)例化表示成為了一個(gè)具體,如果它有屬性,我們能獲?。蝗绻蟹椒?,我們能調(diào)用執(zhí)行方法體的操作,哪怕是空方法體。接口都是抽象方法,用它是不能實(shí)例化出一個(gè)屬性和方法都是具體(實(shí)現(xiàn))的對(duì)象。而抽象方法雖然可以沒有抽象方法(當(dāng)做一個(gè)普通類來使用),但是 JVM 沒有必要?jiǎng)討B(tài)判斷,來決定是否能實(shí)例化,因?yàn)槌橄箢惖某踔圆皇菫榱水?dāng)做一個(gè)普通類來使用。

備注:

在模板方法模式中,抽象類得到了一個(gè)很好的利用,可以借鑒。
1、把公共的方法具體實(shí)現(xiàn),方便子類使用;并定義為 final,防止子類修改;
2、需要子類具體實(shí)現(xiàn)的,才定義為抽象方法,這樣子類就必須實(shí)現(xiàn)了,除非子類也是抽象方法;
3、使用 鉤子方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • 八月三十號(hào)去學(xué)校,九月一號(hào)陸陸續(xù)續(xù)看專業(yè)課(基英),九月二號(hào)陷入猶豫,失眠到五點(diǎn)多,睡前決定改專業(yè)。七點(diǎn)多驚醒,有...
    狂扁小黃人閱讀 137評(píng)論 0 0
  • 結(jié)束了一年的活法學(xué)習(xí),在這一年里我收獲了很多。意識(shí)到自己的問題;學(xué)習(xí)如何更好的工作,;了卻多年心愿,如愿以償;學(xué)會(huì)...
    丁美閱讀 132評(píng)論 0 0
  • 二白_a00c閱讀 287評(píng)論 0 0

友情鏈接更多精彩內(nèi)容