詳解java接口interface

引言

接口這個詞在生活中我們并不陌生。

在中國大陸,我們可以將自己的家用電器的插頭插到符合它插口的插座上;

我們在戴爾,惠普,聯(lián)想,蘋果等品牌電腦之間傳輸數(shù)據(jù)時,可以使用U盤進行傳輸。

插座的普適性是因為大部分都是國標的;U盤可以插到這些電腦上,是因為都遵循了USB2.0或者USB3.0的標準。

在遵循相同標準的前提下,就出現(xiàn)了接口。

接口的定義

由引言可知,接口就是多個類之間的公共規(guī)范。

我們知道,普通類的定義是這樣的

public class 類名{
    
}

接口的定義把class換成interface便可以了,如下所示:

public interface 接口名{
    
}

接口中定義抽象方法

接口中抽象方法的定義如下:

public abstract 方法返回類型 方法名();

其中public和abstract是可以省略的。從而,可以簡寫為如下形式:

方法返回類型 方法名();

接口的抽象方法的使用

接口是不能new對象實例的。那我們怎么調(diào)用接口的抽象方法呢?

我們需要新定義一個類來實現(xiàn)這個接口,然后覆蓋重寫接口中所有的抽象方法。其中實現(xiàn)接口的類定義方式如下:

public class 類名 implements 需要實現(xiàn)的接口名{
 //重寫所有抽象方法
}

比如,可以定義一個接口和一個實現(xiàn)類,然后再定義一個類,來調(diào)用方法。

package com.sjdwz;

/**
 * @Description 接口示例代碼
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public interface MyInterfaceStudy1 {
    public abstract void test01();
}
package com.sjdwz;

/**
 * @Description MyInterfaceStudy1接口的實現(xiàn)
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public class MyInterfaceStudy1Impl implements MyInterfaceStudy1{
    @Override
    public void test01() {
        System.out.println("實現(xiàn)了接口MyInterfaceStudy1的test01方法");
    }
}
package com.sjdwz;

/**
 * @Description 接口抽象方法使用測試
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public class MyInterfaceStudyTest1 {
    public static void main(String[] args) {
        MyInterfaceStudy1Impl myInterfaceStudy1 = new MyInterfaceStudy1Impl();
        myInterfaceStudy1.test01();
    }
}

注意:如果沒有覆蓋重寫所有的抽象方法,那么本實現(xiàn)類需要是一個抽象類。

接口中定義默認方法

假設某場景下,我們的接口需要進行升級,必須添加某些方法來滿足新的需要,如果我們再定義抽象方法的話,那么我們之前實現(xiàn)該接口的所有非抽象類都需要重新進行修改。

那么有沒有一種辦法,能夠讓我們不改動接口實現(xiàn)類的代碼就能完成接口的升級呢?

在Java8中對此給出了答案。

我們可以在接口中定義默認方法。

定義方式如下:

public default 方法返回類型 方法名(){
    //方法里面需要執(zhí)行的內(nèi)容
}

public可以省略。

接口的默認方法的使用

我們在定義接口的實現(xiàn)類時,不需要對默認方法進行覆蓋重寫,就可以使用該方法。請看如下的例子:

接口類的定義

package com.sjdwz;

/**
 * @Description 接口的默認方法
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public interface MyInterfaceStudy2 {
    default void defaultFucTest01(){
        System.out.println("我在defaultFucTest01中,我是一個默認方法,我解決了接口升級的問題");
    }
    void testAbstarct();
}

兩個實現(xiàn)類的定義

package com.sjdwz;

/**
 * @Description TODO
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public class MyInterfaceStudy2Impl implements MyInterfaceStudy2{
    @Override
    public void testAbstarct() {
        System.out.println("我在MyInterfaceStudy2Impl中,我重寫了MyInterfaceStudy2中的抽象方法");
    }
}
package com.sjdwz;

/**
 * @Description TODO
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public class MyInterfaceStudy2DefaultImpl implements MyInterfaceStudy2{
    @Override
    public void defaultFucTest01() {
        System.out.println("我在MyInterfaceStudy2DefaultImpl中,我重寫了MyInterfaceStudy2的默認方法");
    }
    @Override
    public void testAbstarct() {
        System.out.println("我在MyInterfaceStudy2DefaultImpl中,我重寫了MyInterfaceStudy2的默認方法");
    }
}

它們的使用:

package com.sjdwz;

/**
 * @Description TODO
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public class MyInterfaceStudyTest2 {
    public static void main(String[] args) {
        MyInterfaceStudy2Impl myInterfaceStudy2 = new MyInterfaceStudy2Impl();
        myInterfaceStudy2.defaultFucTest01();
        myInterfaceStudy2.testAbstarct();

        MyInterfaceStudy2DefaultImpl myInterfaceStudy2Default = new MyInterfaceStudy2DefaultImpl();
        myInterfaceStudy2Default.defaultFucTest01();
        myInterfaceStudy2Default.testAbstarct();
    }
}

輸出如下:

輸出

由此可見,接口實現(xiàn)類如果沒有重寫接口中的默認方法,會去調(diào)用接口中的默認方法;如果實現(xiàn)類重寫了接口的默認方法,便會調(diào)用重寫的方法。

接口中定義靜態(tài)方法

定義方式如下

public static 方法返回類型 方法名(){
    //方法里面需要執(zhí)行的內(nèi)容
}

public可以省略

接口的靜態(tài)方法的使用

定義接口如下:

package com.sjdwz;
/**
 * @Description 接口中的靜態(tài)方法
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public interface MyInterfaceStudy3 {
    static void staticFuc(){
        System.out.println("我在MyInterfaceStudy3接口中,這是我的靜態(tài)方法");
    }
}

該接口的實現(xiàn)類如下

package com.sjdwz;

/**
 * @Description 實現(xiàn)類
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public class MyInterfaceStudy3Impl implements MyInterfaceStudy3{
}

如果我使用方式如下可以嗎?

錯誤使用

強大的Java編輯器已經(jīng)幫我們提示錯誤了。這樣使用是不可以的。

正確使用方式時接口名.靜態(tài)方法名(參數(shù));。

package com.sjdwz;

/**
 * @Description 接口靜態(tài)方法的使用測試
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public class MyInterfaceStudyTest3 {
    public static void main(String[] args) {
        MyInterfaceStudy3.staticFuc();
    }
}

輸出如下

接口中靜態(tài)方法的輸出

接口中定義常量

定義方式如下

public static final 數(shù)據(jù)類型 常量名 = 666;

其中public static final可以省略。

一般常量名的每個字母都大寫,如果時多個單詞,使用下劃線連接。

如下所示:

int NUM = 666;
int DAILY_HOURS = 24;

接口中常量的使用

定義接口如下:

package com.sjdwz;
/**
 * @Description 接口中定義常量
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public interface MyInterfaceStudy4 {
    int NUM = 666;
    int DAILY_HOURS = 24;
}

實現(xiàn)類如下

package com.sjdwz;

/**
 * @Description 實現(xiàn)類
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public class MyInterfaceStudy4Impl {
}

我們可以使用如下嗎?

錯誤使用

很明顯,又提示錯誤了。不能使用實現(xiàn)類.常量實現(xiàn)類的對象.常量來使用。

正確使用如下:

package com.sjdwz;

/**
 * @Description 接口的常量使用測試
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public class MyInterfaceStudyTest4 {
    public static void main(String[] args) {
        System.out.println("用接口來訪問接口中的常量NUM:======"+MyInterfaceStudy4.NUM);
        System.out.println("用接口來方法接口中的常量DAILY_HOURS:======"+MyInterfaceStudy4.DAILY_HOURS);
    }
}

輸出如下:

輸出

原文鏈接為:https://sjdwz.com/11171.html

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

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

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