最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析Java中接口和抽象類(lèi)的七大區(qū)別

 更新時(shí)間:2021年12月23日 10:35:53   作者:Java中文社群  
Java 是一門(mén)面向?qū)ο蟮木幊陶Z(yǔ)言,面向?qū)ο蟮木幊陶Z(yǔ)言有四大特征:抽象、封裝、繼承和多態(tài)。本文介紹的接口和抽象類(lèi)就是面向?qū)ο缶幊讨小俺橄蟆钡木唧w實(shí)現(xiàn)。本文也將為大家詳細(xì)講一下二者的區(qū)別,需要的可以參考一下

Java 是一門(mén)面向?qū)ο蟮木幊陶Z(yǔ)言,面向?qū)ο蟮木幊陶Z(yǔ)言有四大特征:抽象、封裝、繼承和多態(tài)。

而本文介紹的接口和抽象類(lèi)就是面向?qū)ο缶幊讨小俺橄蟆钡木唧w實(shí)現(xiàn),也就是說(shuō)接口和抽象類(lèi)都是用來(lái)定義實(shí)體類(lèi)的公共行為的,它們是對(duì)實(shí)體類(lèi)(對(duì)象)更高層次的抽象。

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

接口

接口是 Java 語(yǔ)言中的一個(gè)抽象類(lèi)型,用于定義對(duì)象的公共行為。它的創(chuàng)建關(guān)鍵字是 interface,在接口的實(shí)現(xiàn)中可以定義方法和常量,其普通方法是不能有具體的代碼實(shí)現(xiàn)的,而在 JDK 8 之后,接口中可以創(chuàng)建 static 和 default 方法了,并且這兩種方法可以有默認(rèn)的方法實(shí)現(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.");
    }
}

接下來(lái),創(chuàng)建一個(gè)類(lèi)來(lái)實(shí)現(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 方法
        InterfaceExample.smethod();
        // 調(diào)用接口中的常量 count
        System.out.println(InterfaceExample.count);
    }
}

以上程序的執(zhí)行結(jié)果如下:

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

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

抽象類(lèi)

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

抽象類(lèi)的使用如下:

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

接下來(lái)使用一個(gè)普通類(lèi)繼承上面的抽象類(lèi):

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();
        // 抽象類(lèi)中的變量重新賦值
        abs.count = 666;
        System.out.println(abs.count);
        // 抽象類(lèi)中的抽象方法
        abs.methodA();
        // 抽象類(lèi)中的普通方法
        abs.methodB();
    }
}

以上程序的執(zhí)行結(jié)果如下:

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

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

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

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

接口使用關(guān)鍵字 interface 來(lái)定義。

抽象類(lèi)使用關(guān)鍵字 abstract 來(lái)定義。

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

接口使用 implements 關(guān)鍵字定義其具體實(shí)現(xiàn)。

抽象類(lèi)使用 extends 關(guān)鍵字實(shí)現(xiàn)繼承。

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

接口的實(shí)現(xiàn)類(lèi)可以有多個(gè),如下圖所示:

而抽象類(lèi)的子類(lèi),只能繼承一個(gè)抽象類(lèi),如下圖所示,繼承多個(gè)抽象類(lèi)就會(huì)報(bào)錯(cuò):

在 Java 語(yǔ)言中,一個(gè)類(lèi)只能繼承一個(gè)父類(lèi)(單繼承),但可以實(shí)現(xiàn)多個(gè)接口。

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

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

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

抽象類(lèi)中的屬性訪問(wèn)控制符無(wú)限制,可為任意控制符,如下圖所示:

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

接口中方法的默認(rèn)控制符是 public,并且不能定義為其他控制符,如下圖所示:

抽象類(lèi)中的方法控制符無(wú)限制,其中抽象方法不能使用 private 修飾,如下代碼所示:

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

接口中普通方法不能有具體的方法實(shí)現(xiàn),在 JDK 8 之后 static 和 default 方法必須有方法實(shí)現(xiàn),如下代碼所示:

從上述結(jié)果可以看出:static 或 default 方法如果沒(méi)有方法實(shí)現(xiàn)就會(huì)報(bào)錯(cuò),而普通方法如果有方法實(shí)現(xiàn)就會(huì)報(bào)錯(cuò)。

?抽象類(lèi)中普通方法可以有方法實(shí)現(xiàn),抽象方法不能有方法實(shí)現(xiàn),如下代碼所示:

從上述結(jié)果可以看出:抽象類(lèi)中的普通方法如果沒(méi)有方法實(shí)現(xiàn)就會(huì)報(bào)錯(cuò),而抽象方法如果有方法實(shí)現(xiàn)則會(huì)報(bào)錯(cuò)。

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

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

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

總結(jié)

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

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

到此這篇關(guān)于淺析Java中接口和抽象類(lèi)的七大區(qū)別的文章就介紹到這了,更多相關(guān)Java接口和抽象類(lèi)的區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot驗(yàn)證碼生成以及驗(yàn)證功能舉例詳解

    springboot驗(yàn)證碼生成以及驗(yàn)證功能舉例詳解

    登錄注冊(cè)是大部分系統(tǒng)需要實(shí)現(xiàn)的基本功能,同時(shí)也會(huì)對(duì)登錄驗(yàn)證增加需求,下面這篇文章主要給大家介紹了關(guān)于springboot驗(yàn)證碼生成以及驗(yàn)證功能的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • Spring如何使用注解的方式創(chuàng)建bean

    Spring如何使用注解的方式創(chuàng)建bean

    這篇文章主要介紹了Spring如何使用注解的方式創(chuàng)建bean,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • IDEA如何對(duì)多線程進(jìn)行debug的示例詳解

    IDEA如何對(duì)多線程進(jìn)行debug的示例詳解

    開(kāi)發(fā)中使用到多線程的時(shí)候不少,但是debug起來(lái)還是比較困難的,因?yàn)槟J(rèn)每次只會(huì)進(jìn)入一個(gè)線程,這樣有些問(wèn)題是發(fā)現(xiàn)不了的,其實(shí)IDEA也是支持進(jìn)入每個(gè)線程來(lái)debug的,本文給大家介紹了IDEA如何對(duì)多線程進(jìn)行debug的示例,需要的朋友可以參考下
    2024-05-05
  • Java基礎(chǔ)之Maven詳解

    Java基礎(chǔ)之Maven詳解

    這篇文章主要介紹了Java基礎(chǔ)之Maven詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java多線程編程實(shí)戰(zhàn)之模擬大量數(shù)據(jù)同步

    Java多線程編程實(shí)戰(zhàn)之模擬大量數(shù)據(jù)同步

    這篇文章主要介紹了Java多線程編程實(shí)戰(zhàn)之模擬大量數(shù)據(jù)同步,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • springboot lua檢查redis庫(kù)存的實(shí)現(xiàn)示例

    springboot lua檢查redis庫(kù)存的實(shí)現(xiàn)示例

    本文主要介紹了springboot lua檢查redis庫(kù)存的實(shí)現(xiàn)示例,為了優(yōu)化性能,通過(guò)Lua腳本實(shí)現(xiàn)對(duì)多個(gè)馬戲場(chǎng)次下的座位等席的庫(kù)存余量檢查,感興趣的可以了解一下
    2024-09-09
  • 深入解析堆排序的算法思想及Java代碼的實(shí)現(xiàn)演示

    深入解析堆排序的算法思想及Java代碼的實(shí)現(xiàn)演示

    堆排序基于二叉堆結(jié)構(gòu)即完全二叉樹(shù),可利用最大堆和最小堆的組建方式來(lái)進(jìn)行排序,這里就來(lái)深入解析堆排序的算法思想及Java代碼的實(shí)現(xiàn)演示
    2016-06-06
  • Java Lambda表達(dá)式實(shí)例解析原理

    Java Lambda表達(dá)式實(shí)例解析原理

    日常開(kāi)發(fā)中,我們很多時(shí)候需要用到Java?8的Lambda表達(dá)式,它允許把函數(shù)作為一個(gè)方法的參數(shù),讓我們的代碼更優(yōu)雅、更簡(jiǎn)潔。所以整理了一波工作中常用的Lambda表達(dá)式??赐暌欢〞?huì)有幫助的
    2023-03-03
  • SpringBoot實(shí)現(xiàn)其他普通類(lèi)調(diào)用Spring管理的Service,dao等bean

    SpringBoot實(shí)現(xiàn)其他普通類(lèi)調(diào)用Spring管理的Service,dao等bean

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)其他普通類(lèi)調(diào)用Spring管理的Service,dao等bean,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java使用非覆蓋的方法實(shí)現(xiàn)替換PDF中的文本

    Java使用非覆蓋的方法實(shí)現(xiàn)替換PDF中的文本

    這篇文章主要為大家詳細(xì)介紹了Java如何使用非覆蓋的方法實(shí)現(xiàn)替換PDF中的文本,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02

最新評(píng)論

天峻县| 姚安县| 龙陵县| 辽中县| 五河县| 石狮市| 凤翔县| 罗江县| 汉阴县| 红桥区| 民权县| 镇雄县| 山阳县| 石渠县| 无锡市| 商河县| 讷河市| 福建省| 平远县| 师宗县| 延庆县| 阿拉尔市| 连南| 孙吴县| 崇义县| 怀化市| 广饶县| 辽源市| 明光市| 宁南县| 茌平县| 福清市| 哈巴河县| 宁海县| 抚顺市| 大名县| 汉寿县| 连云港市| 天气| 大新县| 旌德县|