溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Java接口的本質(zhì)實(shí)例分析

發(fā)布時(shí)間:2022-03-02 09:13:00 來(lái)源:億速云 閱讀:214 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“Java接口的本質(zhì)實(shí)例分析”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Java接口的本質(zhì)實(shí)例分析”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

    接口

    Java接口是一系列方法的聲明,是一些方法特征的集合,一個(gè)接口只有方法的特征沒(méi)有方法的實(shí)現(xiàn),因此這些方法可以在不同的地方被不同的類(lèi)實(shí)現(xiàn),而這些實(shí)現(xiàn)可以具有不同的行為(功能)。

    接口的定義

    接口:

    • 在JAVA編程語(yǔ)言中是一個(gè)抽象類(lèi)型,是抽象方法的集合,接口通常以interface來(lái)聲明。一個(gè)類(lèi)通過(guò)繼承接口的方式,從而來(lái)繼承接口的抽象方法。而接口是更加徹底的抽象,接口中全部是抽象方法。(JDK8之前),接口同樣是不能創(chuàng)建對(duì)象的。

    • 并且為了彌補(bǔ)我們之前繼承中只能單繼承的缺點(diǎn),Java為了我們提供了接口,它可以多實(shí)現(xiàn)接口。

    • 接口更像是表達(dá)一種能力規(guī)范,就想之前我們定義動(dòng)物,動(dòng)物有吃的行為方法,而其他實(shí)現(xiàn)了動(dòng)物接口類(lèi)的動(dòng)物都必須實(shí)現(xiàn)吃這一行為方法。所以其作用主要告訴實(shí)現(xiàn)類(lèi),你要實(shí)現(xiàn)我里面所具備的功能。

    那么接口和抽象有什么區(qū)別嗎?

    接口和抽象的區(qū)別

    • 抽象類(lèi)中的方法可以有方法體,就是能實(shí)現(xiàn)方法的具體功能,但是接口中的方法不行。

    • 抽象類(lèi)中的成員變量可以是各種類(lèi)型的,而接口中的成員變量只能是 public static final 類(lèi)型的。

    • 接口中不能含有靜態(tài)代碼塊以及靜態(tài)方法(用 static 修飾的方法),而抽象類(lèi)是可以有靜態(tài)代碼塊和靜態(tài)方法。

    • 一個(gè)類(lèi)只能繼承一個(gè)抽象類(lèi),而一個(gè)類(lèi)卻可以實(shí)現(xiàn)多個(gè)接口。

    注意:

    JDK 1.8 以后,接口里可以有靜態(tài)方法和方法體了,接口允許包含具體實(shí)現(xiàn)的方法,該方法稱(chēng)為默認(rèn)方法,默認(rèn)方法使用 default 關(guān)鍵字修飾。

    具體的學(xué)習(xí),我們一起來(lái)看看吧!

    接口的格式

    主要通過(guò)interface關(guān)鍵字修飾在類(lèi)上,使其成為一個(gè)接口類(lèi)!接口中的所有方法都必須只聲明方法標(biāo)識(shí),而不要去聲明具體的方法體。

    //接口的格式:
    修飾符 interface 接口名稱(chēng){
    // 抽象方法
    void eat();
    }

    而如果類(lèi)需要去實(shí)現(xiàn)該接口的關(guān)鍵字implements

    實(shí)現(xiàn)的過(guò)程需注意的點(diǎn):

    • 必須重寫(xiě)實(shí)現(xiàn)的全部接口中所有抽象方法。

    • 如果一個(gè)類(lèi)實(shí)現(xiàn)了接口,但是沒(méi)有重寫(xiě)完全部接口的全部抽象方法,這個(gè)類(lèi)也必須定義成抽象類(lèi)。

    //實(shí)現(xiàn)接口的格式:
    修飾符 class 類(lèi)名 implements 接口名 {
    // 實(shí)現(xiàn)接口中的所有抽象方法
    void eat(){}
    }


    // 多實(shí)現(xiàn)的格式:
    修飾符 class 類(lèi)名 implements 接口1,接口2,接口3...{
    // 抽象方法
    void eat();
    ....
    }

    接口中的主要成分

    我們這里先講述在JDK8之前,接口中的成分包含:抽象方法和常量

    抽象方法:

    接口中的抽象方法默認(rèn)會(huì)自動(dòng)加上public abstract修飾程序員無(wú)需自己手寫(xiě)??!

    按照規(guī)范:以后接口中的抽象方法建議不要寫(xiě)上public abstract,為什么呢?因?yàn)闆](méi)有必要啊,默認(rèn)會(huì)加上。

    package src.com.na.pojo;
    
    /**
     * 先定義一個(gè)接口父類(lèi) --> 動(dòng)物類(lèi)
     * 動(dòng)物都有一個(gè)吃的抽象方法
     */
    public interface Animal {
    
    
        // 定義為抽象方法后,無(wú)需去做方法實(shí)體的實(shí)現(xiàn)!
        // 默認(rèn)修飾符就是public abstract 可以忽略不寫(xiě)!
    //    public abstract void eat();
    
        // 這種寫(xiě)法也可以,默認(rèn)忽略了public abstract
        void eat();
    
    }
    常量:

    在接口中,我們定義的成員變量默認(rèn)會(huì)加上: public static final修飾。

    這代表了什么,在接口中定義的成員變量實(shí)際上是一個(gè)常量,而我們知道被final關(guān)鍵字修飾的變量是不可被修改,并且也被static靜態(tài)化修飾了變量,這意味著我們可以直接用接口名訪(fǎng)問(wèn)。

    而我們?cè)诙x成員變量即常量必須要給初始值。

    package src.com.na.pojo;
    
    /**
     * 先定義一個(gè)接口父類(lèi) --> 動(dòng)物類(lèi)
     * 動(dòng)物都有一個(gè)吃的抽象方法
     */
    public interface Animal {
    
        // 定義成員變量是常量
        // 默認(rèn)修飾符就是public static final 可以忽略不寫(xiě)!
    //    public static final String NAME = "動(dòng)物";
        String NAME = "動(dòng)物";
    }

    注意:常量命名規(guī)范建議字母全部大寫(xiě),多個(gè)單詞用下劃線(xiàn)連接。即ANIMAL_NAME

    接口的案例

    我們這次以運(yùn)動(dòng)員為例吧,這蘇神,看得我心血來(lái)潮,這不比什么博人傳、奧特曼來(lái)的熱血多了嗎。

    定義運(yùn)動(dòng)員接口

    package src.com.na.pojo;
    
    /**
     * 定義一個(gè)運(yùn)動(dòng)員接口類(lèi),運(yùn)動(dòng)員可以分很多種:比如田徑運(yùn)動(dòng)員,舉重運(yùn)動(dòng)員,乒乓球運(yùn)動(dòng)員等。
     * 定義了這些運(yùn)動(dòng)員之間的一些規(guī)范。
     */
    public interface SportMan {
    
        // 例如:運(yùn)動(dòng)員,都可以運(yùn)動(dòng),都有對(duì)應(yīng)的項(xiàng)目吧
        void project();
    
        // 運(yùn)動(dòng)員都會(huì)有比賽成績(jī),結(jié)果吧。
        void performance();
    
        // 運(yùn)動(dòng)員都會(huì)參加什么比賽得到什么獎(jiǎng)吧,排在第幾位吧!
        String competition(String project);  
    }

    定義田徑運(yùn)動(dòng)員子類(lèi)去實(shí)現(xiàn)運(yùn)動(dòng)員接口

    package src.com.na.pojo;
    
    /**
     * 定義一個(gè)田徑運(yùn)動(dòng)員,蘇神 yyds! 9.83s
     */
    public class AthleticsMan implements SportMan{
    
        /*
        實(shí)現(xiàn)接口后,必須重寫(xiě)里面的所有抽象方法?。?!
         */
        @Override
        public void project() {
            System.out.println("蘇神參加了奧運(yùn)會(huì)100米項(xiàng)目??!");
        }
    
        @Override
        public void performance() {
            System.out.println("蘇神創(chuàng)造了歷史,代表亞洲人可以沖進(jìn)100米決賽,踏進(jìn)決賽!并創(chuàng)造了亞洲記錄9.83s!!!!");
        }
    
        @Override
        public String competition(String project) {
            return "蘇炳添參加"+project+"得到第六名!yyds!!!";
        }
    }

    定義測(cè)試類(lèi):

    package src.com.na;
    
    import src.com.na.pojo.AthleticsMan;
    
    /**
     * 測(cè)試接口
     */
    public class Demo {
        public static void main(String[] args) {
            AthleticsMan suBingTian = new AthleticsMan();
            suBingTian.project();
            suBingTian.performance();
            System.out.println(suBingTian.competition("100米"));
        }
    }

    結(jié)果:

    蘇神參加了奧運(yùn)會(huì)100米項(xiàng)目?。?br/>蘇神創(chuàng)造了歷史,代表亞洲人可以沖進(jìn)100米決賽,踏進(jìn)決賽!并創(chuàng)造了亞洲記錄9.83s!!!!
    蘇炳添參加100米得到第六名!yyds!!!

    接口與接口的關(guān)系

    我們知道類(lèi)與類(lèi)之間可以有繼承關(guān)系,而我們接口與類(lèi)之間是實(shí)現(xiàn)關(guān)系,那么接口與接口之間的關(guān)系呢?

    在Java中,接口與接口之間是可以多繼承的:也就是一個(gè)接口可以同時(shí)繼承多個(gè)接口。相當(dāng)于在繼承中,將其他接口其他接口的抽象方法與本接口進(jìn)行了合并。

    代碼如下:

    package src.com.na;
    
    public class Demo2 {
    }
    
    
    // run接口
    interface Run{
        void run();
    }
    
    interface Project{
        void Project();
    }
    
    /*
     *  總結(jié):
     *     接口與類(lèi)之間是多實(shí)現(xiàn)的。
     *     接口與接口之間是多繼承的。
     * */
    interface SportMan2 extends Run , Project {
        String competition(String project);  // 抽象方法,比賽。
    }

    JDK 8之后的接口新增方法

    在JDK 8開(kāi)始之后,接口似乎變得不再純潔了!

    接口中不再只是抽象方法,接口還可以有默認(rèn)方法(也就是實(shí)例方法),和靜態(tài)方法了,還包含了私有實(shí)例方法和私有靜態(tài)方法

    1. 含有默認(rèn)方法和靜態(tài)方法
    • 默認(rèn)方法:使用 default 修飾,不可省略,供子類(lèi)調(diào)用或者子類(lèi)重寫(xiě)。

    • 靜態(tài)方法:使用 static 修飾,供接口直接調(diào)用。

    代碼如下:

    package src.com.na.pojo;
    
    /**
     * 測(cè)試接口中可以含有默認(rèn)方法和靜態(tài)方法
     */
    public interface InterfaceTest {
        // 含有默認(rèn)方法,default關(guān)鍵字
        public default void defaultMethod() {
            System.out.println("默認(rèn)方法");
        }
    
        // 含有靜態(tài)方法,static關(guān)鍵字
        public static void staticMethod() {
            System.out.println("靜態(tài)方法");
        }
    }
    2. 含有私有方法和私有靜態(tài)方法
    • 私有方法:使用 private 修飾,供接口中的默認(rèn)方法或者靜態(tài)方法調(diào)用。

    • 私有靜態(tài)方法:使用 private 修飾,使用 static 修飾。

    代碼如下:

    package src.com.na.pojo;
    
    /**
     * 測(cè)試接口中可以含有私有方法和私有靜態(tài)方法
     */
    public interface InterfaceTest2 {
        // 含有私有方法,private修飾
        private void privateMethod() {
            System.out.println("私有方法");
        }
    
        // 含有私有靜態(tài)方法,static關(guān)鍵字,private修飾
        private static void privateStaticMethod() {
            System.out.println("私有靜態(tài)方法");
        }
    }

    ‍♂? 接口的特點(diǎn):

    • 接口中的方法全是抽象方法,默認(rèn)會(huì)自動(dòng)加上public abstract修飾。

    • 接口中,無(wú)法定義成員變量,但是可以定義常量,其值不可以改變,默認(rèn)使用public static final修飾。

    • 接口中,沒(méi)有構(gòu)造器,所以是不能創(chuàng)建對(duì)象滴!

    • 類(lèi)與接口之間的關(guān)系是多實(shí)現(xiàn)的。

    • 接口與接口之間關(guān)系是多繼承的。

    • 接口更多體現(xiàn)的是一種規(guī)范。

    • JDK 8開(kāi)始,接口不再純潔,支持靜態(tài)方法,默認(rèn)方法,私有方法。

    讀到這里,這篇“Java接口的本質(zhì)實(shí)例分析”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI