1. 程式人生 > 其它 >詳解java介面interface

詳解java介面interface

引言

介面這個詞在生活中我們並不陌生。

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

我們在戴爾,惠普,聯想,蘋果等品牌電腦之間傳輸資料時,可以使用U盤進行傳輸。

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

在遵循相同標準的前提下,就出現了介面。

介面的定義

由引言可知,介面就是多個類之間的公共規範。

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

public class 類名{
    
}

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

public interface 介面名{
    
}

介面中定義抽象方法

介面中抽象方法的定義如下:

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

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

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

介面的抽象方法的使用

介面是不能new物件例項的。那我們怎麼呼叫介面的抽象方法呢?

我們需要新定義一個類來實現這個介面,然後覆蓋重寫介面中所有的抽象方法。其中實現介面的類定義方式如下:

public class 類名 implements 需要實現的介面名{
 //重寫所有抽象方法
}

比如,可以定義一個介面和一個實現類,然後再定義一個類,來呼叫方法。

package com.sjdwz;

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

/**
 * @Description MyInterfaceStudy1介面的實現
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public class MyInterfaceStudy1Impl implements MyInterfaceStudy1{
    @Override
    public void test01() {
        System.out.println("實現了介面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();
    }
}

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

介面中定義預設方法

假設某場景下,我們的介面需要進行升級,必須新增某些方法來滿足新的需要,如果我們再定義抽象方法的話,那麼我們之前實現該介面的所有非抽象類都需要重新進行修改。

那麼有沒有一種辦法,能夠讓我們不改動介面實現類的程式碼就能完成介面的升級呢?

在Java8中對此給出了答案。

我們可以在介面中定義預設方法。

定義方式如下:

public default 方法返回型別 方法名(){
	//方法裡面需要執行的內容
}

public可以省略。

介面的預設方法的使用

我們在定義介面的實現類時,不需要對預設方法進行覆蓋重寫,就可以使用該方法。請看如下的例子:

介面類的定義

package com.sjdwz;

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

兩個實現類的定義

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();
    }
}

輸出如下:

由此可見,介面實現類如果沒有重寫介面中的預設方法,會去呼叫介面中的預設方法;如果實現類重寫了介面的預設方法,便會呼叫重寫的方法。

介面中定義靜態方法

定義方式如下

public static 方法返回型別 方法名(){
	//方法裡面需要執行的內容
}

public可以省略

介面的靜態方法的使用

定義介面如下:

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

該介面的實現類如下

package com.sjdwz;

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

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

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

正確使用方式時介面名.靜態方法名(引數);

package com.sjdwz;

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

輸出如下

介面中定義常量

定義方式如下

public static final 資料型別 常量名 = 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;
}

實現類如下

package com.sjdwz;

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

我們可以使用如下嗎?

很明顯,又提示錯誤了。不能使用實現類.常量實現類的物件.常量來使用。

正確使用如下:

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