目錄:
一、 接口的概念
二、 接口的聲明
三、 接口的實現(xiàn)
四、 接口中成員變量的特點
五、 接口中成員方法的特點
六、 類和接口的多實現(xiàn)
七、 接口的繼承
八、接口與類的區(qū)別:
九、 抽象類和接口的區(qū)別
十、 接口中的方法是否可以被重載和覆蓋?
十一、 接口的新特性——默認(rèn)方法和靜態(tài)方法(jdk8之后)
十二、 標(biāo)記接口
一、 接口的概念
- 接口是功能的集合,同樣可看做是一種
特殊的數(shù)據(jù)類型,是比抽象類更為抽象的類。 - 接口只描述所應(yīng)該具備的方法,并沒有具體實現(xiàn),具體的實現(xiàn)由接口的
實現(xiàn)類(相當(dāng)于接口的子類)來完成。這樣將功能的定義與實現(xiàn)分離,優(yōu)化了程序設(shè)計。 - 記?。?code>一切事物均有功能,即一切事物均有接口
二、 接口的聲明
- 使用
interface代替了原來的class其他步驟與定義類相同
public interface 接口名稱 extends 其他的類/接口名 {
//聲明變量
//抽象方法
}
- 接口是隱式抽象的,當(dāng)聲明一個接口的時候,不必使用abstract關(guān)鍵字。
三、 接口的實現(xiàn)
- 當(dāng)類實現(xiàn)接口的時候,類要實現(xiàn)接口中
所有的方法。否則,類必須聲明為抽象類。 - 類使用
implements關(guān)鍵字實現(xiàn)接口. - 一個類如果實現(xiàn)接口, 有兩種操作方法:
- 實現(xiàn)類為
非抽象類, 就需要重寫接口中所有的抽象方法. - 實現(xiàn)類為
抽象類, 可以不重寫接口中的抽象方法。
- 實現(xiàn)類為
class 類 implements 接口1,接口2... {
//重寫接口中方法
}
四、 接口中成員變量的特點
- 接口中無法定義普通的成員變量.
- 接口中定義的變量,必須有固定的修飾符修飾
public static final,所以接口中的變量也稱之為常量,其值不能改變。
static 可以被類名、接口名直接調(diào)用
final 最終,固定住變量的值
-
public static final在接口中可以省略不寫,也可以選擇性寫,但是不代表沒有. - 接口中的成員變量必須
顯式初始化.
interface Demo { ///定義一個名稱為Demo的接口。
public static final int NUM = 3;// NUM的值不能改變
}
五、 接口中成員方法的特點
- 接口中的成員都是
public的,不能指定其它的訪問控制修飾符 - 接口中成員方法定義的固定格式:
public abstract 返回值類型 方法名字(參數(shù)列表) - 子類必須
覆蓋接口中所有的抽象方法后,子類才可以實例化,否則子類是一個抽象類。
六、 類和接口的多實現(xiàn)
- 類和接口的
多實現(xiàn)是接口最重要的體現(xiàn):解決多繼承的弊端。將多繼承這種機制在 java 中通過多實現(xiàn)完成了。
多繼承的弊端:
多繼承時,當(dāng)多個父類中有相同功能時,子類調(diào)用會產(chǎn)生不確定性。
其實核心原因就是在于多繼承父類中功能有主體,而導(dǎo)致調(diào)用運行時,不確定運行哪個主體內(nèi)容。
- 為什么多實現(xiàn)能解決?
因為接口中的功能都沒有方法體,都是由子類/實現(xiàn)類重寫來明確
七、 接口的繼承
- 一個接口能繼承另一個接口,和類之間的繼承方式比較相似。接口的繼承使用
extends關(guān)鍵字,子接口繼承父接口的方法。 - 在Java中,類的多繼承是不合法,但接口允許多繼承。
八、接口與類的區(qū)別:
- 接口不能用于實例化對象。
- 接口沒有構(gòu)造方法。
- 接口中所有的方法必須是抽象方法。
- 接口不能包含普通成員變量,除了
static和final變量。 - 接口不是被類繼承了,而是要被類實現(xiàn)。
- 接口支持多繼承。
九、 抽象類和接口的區(qū)別
1. 相同點
- 抽象類和接口都位于繼承的頂端,用于
被其他類實現(xiàn)或繼承. - 都
不能直接實例化對象. - 都包含
抽象方法,其子類都必須覆蓋這些抽象方法.
2. 區(qū)別
- 抽象類中的方法可以有方法體,就是能實現(xiàn)方法的具體功能,但是接口中的方法不行。
- 抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是
public static final類型的。 - 接口中
不能含有靜態(tài)代碼塊以及靜態(tài)方法(用 static 修飾的方法),而抽象類是可以有靜態(tài)代碼塊和靜態(tài)方法。 - 一個類只能繼承一個抽象類,而一個類卻可以實現(xiàn)多個接口。
3. 二者的選擇:
-
優(yōu)先選用接口,盡量少用抽象類; - 需要定義子類的行為,又要為子類提供共性功能時才選用抽象類;
十、 接口中的方法是否可以被重載和覆蓋?
-
重載: 對于接口中的方法重載,重載條件和普通類沒有任何區(qū)別,只是重載的方法沒有方法體 -
覆蓋: 接口中的方法也可以覆蓋(Override),但沒有實際的意義,因為接口中不提供方法的實現(xiàn)
十一、 接口的新特性——默認(rèn)方法和靜態(tài)方法(jdk8之后)
1. 默認(rèn)方法
- 可以在不影響已有類的情況下,修改接口
- 可以有方法實現(xiàn)
- 父類中的默認(rèn)方法可以被子接口繼承
- 子接口可以覆蓋父接口中的默認(rèn)方法,甚至還可以把父接口中的默認(rèn)方法覆蓋為抽象方法
- 實現(xiàn)接口后,因為默認(rèn)方法不是抽象方法,所以可以不重寫,但是如果開發(fā)需要,也可以重寫
- 默認(rèn)方法使用
default關(guān)鍵字,只能通過接口實現(xiàn)類的對象來調(diào)用。 - 注意:默認(rèn)方法的訪問權(quán)限也是默認(rèn)
public
2. 靜態(tài)方法
- 可以有方法實現(xiàn)
- 可以直接通過
接口名來訪問 - 靜態(tài)方法沒有方法覆蓋,因為靜態(tài)方法沒有運行時多態(tài)
interface Test{
//這個是默認(rèn)方法
default String get(String aa){
System.out.println("我是jdk1.8默認(rèn)實現(xiàn)方法...");
return "";
}
//這個是靜態(tài)方法
static void staticmethod(){
System.out.println("我是靜態(tài)方法");
}
}
3. 注意事項
- 接口默認(rèn)方法、靜態(tài)方法可以有多個。
- 默認(rèn)方法通過實例調(diào)用,靜態(tài)方法通過接口名調(diào)用。
-
default默認(rèn)方法關(guān)鍵字只能用在接口中。 - 默認(rèn)方法可以被繼承,如果繼承了多個接口,多個接口都定義了多個同樣的默認(rèn)方法,實現(xiàn)類需要重寫默認(rèn)方法不然會報錯。
- 靜態(tài)方法不能被繼承及覆蓋,所以只被具體所在的接口調(diào)用。
十二、 標(biāo)記接口
- 標(biāo)記接口是
沒有任何方法和屬性的接口. - 它僅僅表明它的類屬于一個特定的類型,供其他代碼來測試允許做一些事情。
- 標(biāo)記接口作用:簡單形象的說就是給某個對象打個標(biāo)(蓋個戳),使對象擁有某個或某些特權(quán)。
- 例如:java.awt.event 包中的 MouseListener 接口繼承的 java.util.EventListener 接口定義如下:
package java.util;
public interface EventListener {
}
- 標(biāo)記接口主要用于以下兩種
目的:建立一個公共的父接口:
正如EventListener接口,這是由幾十個其他接口擴展的Java API,你可以使用一個標(biāo)記接口來建立一組接口的父接口。 例如:當(dāng)一個接口繼承了EventListener接口,Java虛擬機(JVM)就知道該接口將要被用于一個事件的代理方案。向一個類添加數(shù)據(jù)類型:
這種情況是標(biāo)記接口最初的目的,實現(xiàn)標(biāo)記接口的類不需要定義任何接口方法(因為標(biāo)記接口根本就沒有方法),但是該類通過多態(tài)性變成一個接口類型。