<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java 中接口和抽象類竟然有 7 點(diǎn)不同?

          共 3494字,需瀏覽 7分鐘

           ·

          2021-12-30 05:20

          作者 |?磊哥

          來源 | Java面試真題解析(ID:aimianshi666)

          轉(zhuǎn)載請聯(lián)系授權(quán)(微信ID:GG_Stone)

          本文已收錄《Java常見面試題》系列:https://gitee.com/mydb/interview

          Java 是一門面向?qū)ο蟮木幊陶Z言,面向?qū)ο蟮木幊陶Z言有四大特征:抽象、封裝、繼承和多態(tài)。而本文介紹的接口和抽象類就是面向?qū)ο缶幊讨小俺橄蟆钡木唧w實現(xiàn),也就是說接口和抽象類都是用來定義實體類的公共行為的,它們是對實體類(對象)更高層次的抽象。

          說明:本文以下內(nèi)容基于 JDK 8 版本。

          接口

          接口是 Java 語言中的一個抽象類型,用于定義對象的公共行為。它的創(chuàng)建關(guān)鍵字是 interface,在接口的實現(xiàn)中可以定義方法和常量,其普通方法是不能有具體的代碼實現(xiàn)的,而在 JDK 8 之后,接口中可以創(chuàng)建 static 和 default 方法了,并且這兩種方法可以有默認(rèn)的方法實現(xiàn),如下代碼所示:

          public?interface?Interface_1?{
          ????int?count?=?1;
          ????void?sayHi();
          ????//?default?方法
          ????default?void?print()?{
          ????????System.out.println("Do?print?method.");
          ????}
          ????//?static?方法
          ????static?void?smethod()?{
          ????????System.out.println("Do?static?method.");
          ????}
          }

          接下來,創(chuàng)建一個類來實現(xiàn)以上接口:

          public?class?InterfaceImpl_1?implements?Interface_1?{
          ????@Override
          ????public?void?sayHi()?{
          ????????System.out.println("Hi,I?am?InterfaceImpl?1.");
          ????}
          ????public?static?void?main(String[]?args)?{
          ????????InterfaceImpl_1?inter?=?new?InterfaceImpl_1();
          ????????inter.sayHi();
          ????????//?調(diào)用接口中?static?方法
          ????????Interface_1.smethod();
          ????????//?調(diào)用接口中的常量?count
          ????????System.out.println(Interface_1.count);
          ????}
          }

          以上程序的執(zhí)行結(jié)果如下:通過上述代碼和執(zhí)行結(jié)果我們可以得出以下結(jié)論:

          1. JDK 8 中接口可以定義 static 和 default 方法,并且這兩種方法可以包含具體的代碼實現(xiàn)。
          2. 實現(xiàn)接口要使用 implements 關(guān)鍵字。
          3. 接口不能直接實例化。
          4. 接口中定義的變量默認(rèn)為 public static final 類型。
          5. 子類可以不重寫接口中的 static 和 default 方法,不重寫的情況下,默認(rèn)調(diào)用的是接口的方法實現(xiàn)。

          抽象類

          抽象類和接口類似,它也是用來定義對象的公共行為的,并且它也不能直接實例化,抽象類的實現(xiàn)關(guān)鍵字為 abstract class,子類用 extends 關(guān)鍵字繼承父類。抽象類的使用如下:

          public?abstract?class?AbstractExample?{
          ????//?定義普通變量
          ????int?count?=?2;
          ????//?定義私有變量
          ????private?static?int?total?=?10;
          ????//?定義抽象方法
          ????public?abstract?void?methodA();
          ????//?定義普通方法
          ????public?void?methodB()?{
          ????????System.out.println("Hi,methodB.");
          ????}
          }

          接下來使用一個普通類繼承上面的抽象類:

          public?class?AbstractSon?extends?AbstractExample?{
          ????@Override
          ????public?void?methodA()?{
          ????????System.out.println("Hi,method?A.");
          ????}
          ????public?static?void?main(String[]?args)?{
          ????????AbstractSon?abs?=?new?AbstractSon();
          ????????//?抽象類中的變量重新賦值
          ????????abs.count?=?666;
          ????????System.out.println(abs.count);
          ????????//?抽象類中的抽象方法
          ????????abs.methodA();
          ????????//?抽象類中的普通方法
          ????????abs.methodB();
          ????}
          }

          以上程序的執(zhí)行結(jié)果如下:通過上述代碼和執(zhí)行結(jié)果可以得出以下結(jié)論:

          1. 抽象類使用 abstract 關(guān)鍵字聲明。
          2. 抽象類中可以包含普通方法和抽象方法,抽象方法不能有具體的代碼實現(xiàn)。
          3. 抽象類需要使用 extends 關(guān)鍵字實現(xiàn)繼承。
          4. 抽象類不能直接實例化。
          5. 抽象類中屬性控制符無限制,可以定義 private 類型的屬性。

          接口和抽象類的區(qū)別主要體現(xiàn)在以下 7 個方面。

          區(qū)別1:定義關(guān)鍵字不同

          接口使用關(guān)鍵字 interface 來定義。抽象類使用關(guān)鍵字 abstract 來定義。

          區(qū)別2:繼承或?qū)崿F(xiàn)的關(guān)鍵字不同

          接口使用 implements 關(guān)鍵字定義其具體實現(xiàn)。抽象類使用 extends 關(guān)鍵字實現(xiàn)繼承。

          區(qū)別3:子類擴(kuò)展的數(shù)量不同

          接口的實現(xiàn)類可以有多個,如下圖所示:而抽象類的子類,只能繼承一個抽象類,如下圖所示,繼承多個抽象類就會報錯:在 Java 語言中,一個類只能繼承一個父類(單繼承),但可以實現(xiàn)多個接口。

          區(qū)別4:屬性訪問控制符不同

          接口中屬性的訪問控制符只能是 public,如下圖所示:

          接口中的屬性默認(rèn)是 public static final 修飾的。

          抽象類中的屬性訪問控制符無限制,可為任意控制符,如下圖所示:

          區(qū)別5:方法控制符不同

          接口中方法的默認(rèn)控制符是 public,并且不能定義為其他控制符,如下圖所示:抽象類中的方法控制符無限制,其中抽象方法不能使用 private 修飾,如下代碼所示:

          區(qū)別6:方法實現(xiàn)不同

          接口中普通方法不能有具體的方法實現(xiàn),在 JDK 8 之后 static 和 default 方法必須有方法實現(xiàn),如下代碼所示:從上述結(jié)果可以看出:static 或 default 方法如果沒有方法實現(xiàn)就會報錯,而普通方法如果有方法實現(xiàn)就會報錯。

          抽象類中普通方法可以有方法實現(xiàn),抽象方法不能有方法實現(xiàn),如下代碼所示:從上述結(jié)果可以看出:抽象類中的普通方法如果沒有方法實現(xiàn)就會報錯,而抽象方法如果有方法實現(xiàn)則會報錯。

          區(qū)別7:靜態(tài)代碼塊使用不同

          接口中不能使用靜態(tài)代碼塊,如下代碼所示:抽象類中可以使用靜態(tài)代碼塊,如下代碼所示:

          總結(jié)

          接口和抽象類都是用來定義對象的公共行為的,但二者有以下 7 點(diǎn)不同:

          1. 定義的關(guān)鍵字不同。
          2. 子類繼承或?qū)崿F(xiàn)關(guān)鍵字不同。
          3. 類型擴(kuò)展不同:抽象類是單繼承,而接口是多繼承。
          4. 方法訪問控制符:抽象類無限制,只是抽象類中的抽象方法不能被 private 修飾;而接口有限制,接口默認(rèn)的是 public 控制符。
          5. 屬性方法控制符:抽象類無限制,而接口有限制,接口默認(rèn)的是 public 控制符。
          6. 方法實現(xiàn)不同:抽象類中的普通方法必須有實現(xiàn),抽象方法必須沒有實現(xiàn);而接口中普通方法不能有實現(xiàn),但在 JDK 8 中的 static 和 defualt 方法必須有實現(xiàn)。
          7. 靜態(tài)代碼塊的使用不同:抽象類可以有靜態(tài)代碼塊,而接口不能有。

          你還知道哪些接口和抽象類的不同?歡迎評論區(qū)留言補(bǔ)充。

          是非審之于己,毀譽(yù)聽之于人,得失安之于數(shù)。

          公眾號:Java面試真題解析



          往期推薦


          面試官:HashSet如何保證元素不重復(fù)?


          面試官:如何實現(xiàn) List 集合去重?


          面試官:元素排序Comparable和Comparator有什么區(qū)別?


          瀏覽 24
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  午夜福利一区二区三区 | 国产8x8x | 成人免费看黄片 | 三级黄片毛片 | aaa三级片久久久 |