在Java中,介面(Interface)是一個強大的概念,它允許我們定義抽象的方法集合,這些方法可以被多個類實現。它提供了一種實現多重繼承的方式,同時幫助我們實現代碼的結構化和解耦。介面也是類別的一種,作用很像抽象類別,不得直接用 “new” 產生新物件,其內部之方法程序只有名稱,沒有實作區塊,較抽象類別更為嚴格。
存取修飾元 interface 名稱 extends 父介面1,父介面2{
常數
抽象方法
內部類別、介面、枚舉定義
default方法、類別方法
}
例如:public interface Ipuppy
從上面程式碼中可以看出來,介面裡不能包含建構子和初始化區域
介面裡只能包含:
成員變數
int MAX_SIZE = 50;
在介面內定義常數,系統會自動為這些變數 加上 public static final ,而且介面裡沒有建構子和初始化區域,所以在定義時就需要指定預設值。
public static final int MAX_SIZE = 50;
抽象方法
void out();
定義普通方法,系統會自動為這些方法 加上 public abstract修飾,所以要注意的是定義這些普通方法不能有方法實作,即不能有{ }
內部類別、內部介面、內部枚舉
不管有沒有定義修飾詞,預設都是採用public static
default方法、類別方法
default void test(){ }
static void staticTest(){ }
在介面中唯一可以有{ } 就是上面這兩個方法
default方法
介面的繼承和類別繼承不一樣,介面完全支援多重繼承,即一個介面可以有多個直接父介面。和類別繼承相似,子介面擴展某個父介面,將會獲得父介面裡定義的所有抽象方法、常數。
一個介面繼承多個父介面時,多個父介面排在 extends 開鍵宇之後,多個父介面之間以英文逗號(,)隔開。
interface interfaceA{
int PROP_A= 5;
void testA():
}
interface interfaceB{
int PROP_B = 6;
void testB();
}
interface interfaceC extends interfaceA, interfaceB{
int PROP_C = 7;
void testc();
}
public class InterfaceExtendsTest{
public static void main(String[] args){
System.out.println(interfaceC.PROPA);
System.out.println(interfaceC.PROP_B);
System.out.println(interfaceC.PROP_C);
}
}
/*
結果:
5
6
7
*/
介面用途:
介面多重繼承的語法:
interface 介面 extends 父介面1, 父介面2, ...
{
//新增的靜態常數及抽象方法
}
類別實作多個介面的語法:
class 類別名稱 implements 介面1, 介面2, ...
{
//類別主體敘述
}
一個類别可以實作一個或多個介面,繼承使用 extends 關鍵字,實作則使用implements 關鍵字。因為一個類别可以實作多個介面,這也是Java 為單一繼承靈活性不足所做的補充。
規則:
implements 部分必須放在extends 部分之後。
類别必須完全實作這些介面裡所定義的全部抽象方法
(也就是覆寫這些抽象方法);否則,該類別將保留從父介面那裡繼承承到的抽象方法,該類別也必須定義成抽象類別。
public class Interface01 {
public static void main(String[] args) {
//1.宣告子類,再建立子類物件+執行
Type_C c = new Player();
c.conn();
c.exit();
//2.臨時產生子類件:宣告+執行
Type_C c2 = new Type_C() {
int a = 100;
void AA() {System.out.println(a);}
@Override
public void conn() {
System.out.println("傳輸檔案2");
}
@Override
public void exit() {
System.out.println("安全退出2");
}
};
c2.conn();
c2.exit();
}
}
//---------------------------
interface Type_C{
String m = "D02";//一律為常數 public static final
//void XX() {}//不可出現一般方法
//Type_C(){}//不可有建構方法
//static {}
//替代一般方法:1) static方法 2)default方法-->不需要子類改寫
default void XX() {}
static void XXX() {}
void conn();//一律為 public abstract
void exit();
}
class Player implements Type_C{
@Override
public void conn() {
System.out.println("傳輸檔案");
}
@Override
public void exit() {
System.out.println("安全退出");
}
}
補充說明:上面的@Override
Java的覆寫(Override)是指子類別繼承父類別時,改寫父類別原有的方法內容。
上例的 標註( Annotations )— @Override,只是一個好習慣,而非規定!
告知編譯器,此方法試圖 覆寫 父類別方法,並幫助開發時釐清 方法 的類別層級。