首頁 > 軟體

Java十分鐘精通介面的使用與原理

2022-03-12 19:00:03

何為介面?

官方解釋:

Java內的介面是一系列方法的宣告,是一些方法特徵的集合,一個介面只有方法的特徵沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為(功能)。

個人理解解釋:

其實介面可以理解為一種特殊的類,這個類裡面全部是由全域性常數和**公共的抽象方法(需要重寫)所組成。介面是解決Java無法使用多繼承的一種手段。我們可以把介面理解為是一個100%的抽象類,既介面中的方法必須全部是抽象方法。反正介面裡面都是方法,但是沒有方法體,其他類實現這個介面後重寫方法體即可。

為什麼要用介面

  • 介面被用來描述一種抽象。
  • Java可以通過實現介面來彌補一個類不能多繼承的侷限
  • 介面也被用來實現解耦
  • 介面被用來實現抽象,而抽象類也被用來實現抽象,為什麼一定要用介面呢?介面和抽象類之間又有什麼區別呢?原因是抽象類內部可能包含非final的變數,但是在介面中存在的變數一定是final,public,static的。

介面怎麼寫?

建立介面的關鍵字:interface

實現介面的關鍵字:implements

public interface StudentTest {   //StudentTest:介面名稱
     
    public void Study();      //介面內的方法,在介面內不提供方法體。
}
//這就是一個簡單的介面

實現介面:

public class student implements StudentTest{
    
    @Override
    public void Study(){
        System.out.println("我繼承了StudentTest,並重寫了介面內的Study方法");
    }
}

//測試類
public class TestMain {
    public static void main(String[] args) {
        student s = new student();
        s.Study();
    }
}

//輸出:我繼承了StudentTest,並重寫了介面內的Study方法

//程式碼解釋:
//1、用interface建立StudentTest介面,介面內有Study方法
//2、新建student類,用implements實現StudentTest介面
//3、重寫Study()方法
//4、測試類測試

注意:實現一個介面,需要重寫這個介面裡面的所有方法!!!!

上述程式碼和解釋完成了對介面的初步理解,下面我們對介面有個進一步的理解:

進一步理解介面:

在生活中,我們都有U盤,若要在電腦上對U盤進行讀取和寫入,我們需要使用USB介面。一臺電腦有多個USB介面,所以我們先定義兩個USB介面,並且有兩個方法,分別是讀取和寫入:

//第一個USB介面
public interface USB1 {   
    public void read_1();  //讀取方法
    public void write_1();  //寫入方法
}


//第二個USB介面
public interface USB2 {
    public void read_2();  //第二個U盤的方法
    public void write_2();
}

然後我們有一個U盤,因為U盤使用的是標準USB介面,所以兩個USB介面我們都可以進行讀取和寫入,U盤類就實現了USB1和USB2兩個介面,並重寫了方法:

package instance_test;

public class YOUPAN implements USB1,USB2{
    @Override
    public void read_1() {
            System.out.println("這是用第一個USB的讀取介面");
    };

    @Override
    public void write_1() {
            System.out.println("這是用第一個USB的寫入介面");
    };

    @Override
    public void read_2() {
            System.out.println("這是用第二個USB的讀取介面");

    };

    @Override
    public void write_2() {
            System.out.println("這是用第二個USB的寫入介面");
        };

    }

//意思是U盤只要符合USB介面標準,使用任意一個都可以操作方法

然後我們開始使用兩個介面:

測試類:

public class Test_Main {
    public static void main(String[] args) {
        YOUPAN y = new YOUPAN();
        y.read_1();
        y.write_1();
        y.read_2();
        y.write_2();
    }
}

結果:

/*
這是用第一個USB的讀取介面
這是用第一個USB的寫入介面
這是用第二個USB的讀取介面
這是用第二個USB的寫入介面
*/

然後我們現在有一部手機,有根傳輸線,傳輸線兩頭分別是USB和Type_C,若要用傳輸線對手機進行充電和更新資料,就同時要實現USB和Type_C兩個介面,所以我們新建一個Type_C介面:

public interface Type_C {     //Type_C介面

    public void Charge();    //充電
    public void Update();   //更新資料

}

然後新建一個手機類,有根傳輸線,並且實現了USB介面和Type_C介面:

public class phone implements USB1,Type_C{   //傳輸線實現 USB1,Type_C介面
    
    @Override
    public void read_1() {
    	System.out.println("手機用第一個USB的介面和")
	    //傳輸線使用USB介面的同時,會給一句提示語
    }
	
	
    @Override
    public void write_1() {
    	System.out.println("手機用第一個USB的介面和")
    }

    @Override
    public void Charge(){
        System.out.println("使用Type_C介面充電");
        //傳輸線使用Type_C介面的同時,會給一句提示語
    }

    @Override
    public void Update(){
        System.out.println("使用Type_C介面更新資料");
    }

}

接著測試手機類:

public class Test_Main {
    public static void main(String[] args) {

        phone p = new phone();

        p.read_1();
        p.Charge();
        System.out.println("----------------");
        p.read_1();
        p.Update();
    }
}

結果:

/*
手機用第一個USB的介面和
使用Type_C介面充電
----------------
手機用第一個USB的介面和
使用Type_C介面更新資料

*/

這樣一個類就實現了對多個介面的實現,恰恰解決了Java中類不能繼承多個父類別的侷限性!!

介面的總結:

  • 不能直接範例化介面,因為介面內方法都是抽象的,沒有方法體,需重寫
  • 一個類可以實現多個介面
  • 一個類如果要實現某個介面的話,那麼它必須要實現這個介面中的所有方法
  • 介面中所有的方法都是抽象的和public的,所有的屬性都是public、static、final的
  • 介面用來彌補類無法實現多繼承的侷限
  • 介面也可以用來實現解耦(關於解耦可以參考這篇文章:解耦的理解
  • 介面也可以繼承,並且可以多繼承(沒錯,介面可以多繼承!)
public interface USB3 extends USB1,USB2{
} //這句多繼承語法是OK的

大家看到這裡,已經知道介面也是一個抽象的,那麼介面和抽象類有什麼區別呢?

介面和抽象類的區別(這也是面試題,整理自網際網路):

抽象類和介面的對比:

  • 抽象類是用來捕捉子類的通用特性的。介面是抽象方法的集合。
  • 從設計層面來說,抽象類是對類的抽象,是一種模板設計,介面是行為的抽象,是一種行為的規範。

兩者的相同點:

  • 介面和抽象類都不能範例化
  • 都位於繼承的頂端,用於被其他實現或繼承
  • 都包含抽象方法,其子類都必須覆寫這些抽象方法

兩者不同點:

備註::Java8中介面中引入預設方法和靜態方法,以此來減少抽象類和介面之間 的差異。 現在,我們可以為介面提供預設實現的方法了,並且不用強制子類來實現它。 介面和抽象類各有優缺 點,在介面和抽象類的選擇上,必須遵守這樣一個原則:

  • 行為模型應該總是通過介面而不是抽象類定義,所以通常是優先選用介面,儘量 少用抽象類
  • 選擇抽象類的時候通常是如下情況:需要定義子類的行為,又要為子類提供通用 的功能。

到此這篇關於Java十分鐘精通介面的使用與原理 的文章就介紹到這了,更多相關Java 介面內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com