本文將介紹在 Java 語言中的接口。
通俗點來說邦鲫,接口就是方法的集合窜骄。
接口的定義格式
定義接口的格式:
public interface 接口名稱 {
// 接口內容
}
接口內容可以包含:
JDK 1.7 中:
- 常量
- 抽象方法
JDK 1.8 中:
- 常量
- 抽象方法
- 默認方法
- 靜態(tài)方法
注意事項
- 接口中是沒有靜態(tài)代碼塊或者構造方法的
- 一個類的直接父類是唯一的屁药,但是一個類可以實現多個接口
接口中抽象方法的定義格式
接口的抽象方法定義格式如下:
public abstract void 方法名稱();
如果使用的是 IDEA 進行開發(fā)征峦,那么會看到方法 method 的修飾符 public abstract
是灰色的,這是因為:在接口中呆贿,抽象方法的修飾符默認是 public abstract
厉萝,所以我們可以省略這兩個修飾符:
void 方法名稱();
也可以省略一個:
public void 方法名稱1();
abstract void 方法名稱2();
抽象方法的使用
接口不能直接使用,必須有一個類來實現這個接口榨崩,這個類必須實現(覆蓋重寫)接口中的所有抽象方法谴垫。
定義一個接口 MyInterfaceAbstract
:
public interface MyInterfaceAbstract {
public abstract void method();
}
定義一個實現類 MyInterfaceAbstractImpl
:
public class MyInterfaceAbstractImpl implements MyInterfaceAbstract {
@Override
public void method() {
System.out.println("這是抽象方法");
}
}
創(chuàng)建實現類的對象進行使用:
public class Main {
public static void main(String[] args) {
MyInterfaceAbstractImpl myInterfaceAbstract = new MyInterfaceAbstractImpl();
myInterfaceAbstract.method();
}
}
輸出結果為:
這是抽象方法
注意事項
不能直接 new 接口的對象,而是 new 實現類的對象
如果實現類里沒有實現接口中的所有抽象方法母蛛,那么這個實現類自己就必須是抽象類翩剪。
接口中默認方法的定義格式
從 JDK 8 開始,接口里允許定義默認方法彩郊,可以有方法體前弯。
接口的默認方法定義格式如下:
public default 返回值類型 方法名稱(參數列表) {
方法體...
}
默認方法的使用
假設有一個這樣的場景:
-
有一個接口
MyInterfaceDefault
,這個接口有一個抽象方法method
秫逝,同樣的恕出,在 IDEA 里修飾符public
是灰色的,可以省略:public interface MyInterfaceDefault { public abstract void method(); }
-
有兩個類實現了這個接口违帆,分別是
MyInterfaceDefaultA
和MyInterfaceDefaultB
:public class MyInterfaceDefaultA implements MyInterfaceDefault { @Override public void method() { System.out.println("抽象方法,AAAAAA"); } }
public class MyInterfaceDefaultA implements MyInterfaceDefault { @Override public void method() { System.out.println("抽象方法,BBBBBB"); } }
這時候我想在接口中添加一個新的方法 method2
浙巫,但是如果添加了這個方法,就得在兩個實現類里再實現這個方法,非常麻煩的畴。
如何解決這個問題渊抄?定一個默認方法(JDK 1.8 版本及以上):
public interface MyInterfaceDefault {
public abstract void method();
// 添加一個默認方法
public default void method2() {
// 方法體
System.out.println("我是默認方法");
}
}
這樣的話就不用在實現類里實現這個方法了,就很棒~
注意事項
- 默認方法可以通過接口實現類對象丧裁,直接調用
- 也可以被接口實現類進行覆蓋重寫
接口中靜態(tài)方法的定義格式
從 JDK 8 開始护桦,接口里允許定義靜態(tài)方法,也有方法體煎娇。
定義格式如下:
public static 返回值類型 方法名稱(參數列表) {
方法體...
}
靜態(tài)方法的使用
首先定一個接口 MyInterfaceStatic
二庵,里面有一個靜態(tài)方法,如果使用的是 IDEA 進行開發(fā)缓呛,修飾符 public
也可以省略:
public interface MyInterfaceStatic {
public static void method() {
System.out.println("我是靜態(tài)方法");
}
}
直接在類中使用即可眨猎,不用再定一個接口實現類:
public class Main {
public static void main(String[] args) {
// 接口名稱.方法名稱();
MyInterfaceStatic.method();
}
}
輸出結果:
我是靜態(tài)方法
注意事項
- 不能通過接口實現類的對象來調用接口當中的靜態(tài)方法
- 通過接口名稱,直接調用其中的靜態(tài)方法
- 僅限于 JDK 版本在 1.8 及以上
接口中常量的定義格式
接口當中也可以定義"成員變量"强经,但必須通過 public static final
這三個關鍵字進行修飾,從效果上看寺渗,這其實就是接口的常量匿情。
接口的常量定義格式如下:
public static final 數據類型 常量名稱 = 數據值;
一旦使用 final
關鍵字進行修飾,就說明不可改變信殊。
這其實就是一個常量炬称,一旦賦值,就不可以更改涡拘。
常量的使用
定義一個接口 MyInterfaceConst
玲躯,如果使用 IDEA 進行開發(fā), public static final
是灰色的鳄乏,代表可以省略:
public interface MyInterfaceConst {
public static final int NUM = 10;
}
跟靜態(tài)方法一樣跷车,直接在類中使用即可:
public class Main {
public static void main(String[] args) {
System.out.println(MyInterfaceConst.NUM);
}
}
輸出結果:
10
注意事項
- 接口當中的常量,必須進行賦值
- 常量名稱按照習慣使用大寫字母橱野,用下劃線進行分隔
多個接口的實現
多個接口實現的格式:
public class MyInterfaceImpl implements MyInterfaceA, MyInterfaceB {
// 覆蓋重寫所有抽象方法(接口 A 的和接口 B 的)
}
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-b6xqfsyR-1608263215258)(https://wx2.sbimg.cn/2020/06/19/Snipaste_2020-06-19_19-02-40.png)]
注意事項
- 如果實現類所實現的多個接口中朽缴,存在重復的抽象方法,那么只需要覆蓋重寫一次即可
- 如果實現類所實現的多個接口中水援,存在重復的默認方法密强,那么實現類一定要對沖突的默認方法進行覆蓋重寫
- 一個類的父類當中的方法和接口當中的默認方法產生沖突的話,優(yōu)先用父類中的方法(父類優(yōu)先蜗元,接口其次)