目錄:
一、 接口的概念
二阱洪、 接口的聲明
三便贵、 接口的實(shí)現(xiàn)
四、 接口中成員變量的特點(diǎn)
五冗荸、 接口中成員方法的特點(diǎn)
六承璃、 類(lèi)和接口的多實(shí)現(xiàn)
七、 接口的繼承
八蚌本、接口與類(lèi)的區(qū)別:
九盔粹、 抽象類(lèi)和接口的區(qū)別
十、 接口中的方法是否可以被重載和覆蓋程癌?
十一舷嗡、 接口的新特性——默認(rèn)方法和靜態(tài)方法(jdk8之后)
十二、 標(biāo)記接口
一嵌莉、 接口的概念
- 接口是功能的集合咬崔,同樣可看做是一種
特殊的數(shù)據(jù)類(lèi)型
,是比抽象類(lèi)更為抽象的類(lèi)
烦秩。 - 接口只描述所應(yīng)該具備的方法垮斯,并沒(méi)有具體實(shí)現(xiàn),具體的實(shí)現(xiàn)由接口的
實(shí)現(xiàn)類(lèi)
(相當(dāng)于接口的子類(lèi))來(lái)完成只祠。這樣將功能的定義與實(shí)現(xiàn)分離兜蠕,優(yōu)化了程序設(shè)計(jì)。 - 記着浊蕖:
一切事物均有功能熊杨,即一切事物均有接口
二曙旭、 接口的聲明
- 使用
interface
代替了原來(lái)的class
其他步驟與定義類(lèi)相同
public interface 接口名稱(chēng) extends 其他的類(lèi)/接口名 {
//聲明變量
//抽象方法
}
- 接口是隱式抽象的,當(dāng)聲明一個(gè)接口的時(shí)候晶府,不必使用abstract關(guān)鍵字桂躏。
三、 接口的實(shí)現(xiàn)
- 當(dāng)類(lèi)實(shí)現(xiàn)接口的時(shí)候川陆,類(lèi)要實(shí)現(xiàn)接口中
所有的方法
剂习。否則,類(lèi)必須聲明為抽象類(lèi)
较沪。 - 類(lèi)使用
implements
關(guān)鍵字實(shí)現(xiàn)接口. - 一個(gè)類(lèi)如果實(shí)現(xiàn)接口, 有兩種操作方法:
- 實(shí)現(xiàn)類(lèi)為
非抽象類(lèi)
, 就需要重寫(xiě)接口中所有的抽象方法. - 實(shí)現(xiàn)類(lèi)為
抽象類(lèi)
, 可以不重寫(xiě)接口中的抽象方法鳞绕。
- 實(shí)現(xiàn)類(lèi)為
class 類(lèi) implements 接口1,接口2... {
//重寫(xiě)接口中方法
}
四、 接口中成員變量的特點(diǎn)
- 接口中無(wú)法定義普通的成員變量.
- 接口中定義的變量尸曼,必須有固定的修飾符修飾
public static final
们何,所以接口中的變量也稱(chēng)之為常量
,其值不能改變控轿。
static 可以被類(lèi)名冤竹、接口名直接調(diào)用
final 最終,固定住變量的值
-
public static final
在接口中可以省略不寫(xiě)
茬射,也可以選擇性寫(xiě)贴见,但是不代表沒(méi)有. - 接口中的成員變量必須
顯式初始化
.
interface Demo { ///定義一個(gè)名稱(chēng)為Demo的接口。
public static final int NUM = 3;// NUM的值不能改變
}
五躲株、 接口中成員方法的特點(diǎn)
- 接口中的成員都是
public
的片部,不能指定其它的訪問(wèn)控制修飾符 - 接口中成員方法定義的固定格式:
public abstract 返回值類(lèi)型 方法名字(參數(shù)列表)
- 子類(lèi)必須
覆蓋
接口中所有的抽象方法后,子類(lèi)才可以實(shí)例化
,否則子類(lèi)是一個(gè)抽象類(lèi)霜定。
六档悠、 類(lèi)和接口的多實(shí)現(xiàn)
- 類(lèi)和接口的
多實(shí)現(xiàn)
是接口最重要的體現(xiàn):解決多繼承的弊端。將多繼承這種機(jī)制在 java 中通過(guò)多實(shí)現(xiàn)完成了望浩。
多繼承的弊端:
多繼承時(shí)辖所,當(dāng)多個(gè)父類(lèi)中有相同功能時(shí),子類(lèi)調(diào)用會(huì)產(chǎn)生不確定性磨德。
其實(shí)核心原因就是在于多繼承父類(lèi)中功能有主體缘回,而導(dǎo)致調(diào)用運(yùn)行時(shí),不確定運(yùn)行哪個(gè)主體內(nèi)容典挑。
- 為什么多實(shí)現(xiàn)能解決酥宴?
因?yàn)榻涌谥械墓δ芏紱](méi)有方法體,都是由子類(lèi)/實(shí)現(xiàn)類(lèi)重寫(xiě)來(lái)明確
七您觉、 接口的繼承
- 一個(gè)接口能繼承另一個(gè)接口拙寡,和類(lèi)之間的繼承方式比較相似。接口的繼承使用
extends
關(guān)鍵字琳水,子接口繼承父接口的方法肆糕。 - 在Java中般堆,類(lèi)的多繼承是不合法,但接口允許多繼承诚啃。
八淮摔、接口與類(lèi)的區(qū)別:
- 接口不能用于實(shí)例化對(duì)象。
- 接口沒(méi)有構(gòu)造方法始赎。
- 接口中所有的方法必須是抽象方法和橙。
- 接口不能包含普通成員變量,除了
static
和final
變量极阅。 - 接口不是被類(lèi)繼承了胃碾,而是要被類(lèi)實(shí)現(xiàn)涨享。
- 接口支持多繼承筋搏。
九、 抽象類(lèi)和接口的區(qū)別
1. 相同點(diǎn)
- 抽象類(lèi)和接口都位于繼承的頂端,用于
被其他類(lèi)實(shí)現(xiàn)或繼承
. - 都
不能直接實(shí)例化
對(duì)象. - 都包含
抽象方法
,其子類(lèi)都必須覆蓋
這些抽象方法.
2. 區(qū)別
- 抽象類(lèi)中的方法可以有方法體厕隧,就是能實(shí)現(xiàn)方法的具體功能奔脐,但是接口中的方法不行。
- 抽象類(lèi)中的成員變量可以是各種類(lèi)型的吁讨,而接口中的成員變量只能是
public static final
類(lèi)型的髓迎。 - 接口中
不能含有靜態(tài)代碼塊以及靜態(tài)方法
(用 static 修飾的方法),而抽象類(lèi)是可以有靜態(tài)代碼塊和靜態(tài)方法建丧。 - 一個(gè)類(lèi)只能繼承一個(gè)抽象類(lèi)排龄,而一個(gè)類(lèi)卻可以實(shí)現(xiàn)多個(gè)接口。
3. 二者的選擇:
-
優(yōu)先選用接口
,盡量少用抽象類(lèi); - 需要定義子類(lèi)的行為,又要為子類(lèi)提供共性功能時(shí)才選用抽象類(lèi);
十翎朱、 接口中的方法是否可以被重載和覆蓋橄维?
-
重載
: 對(duì)于接口中的方法重載,重載條件和普通類(lèi)沒(méi)有任何區(qū)別拴曲,只是重載的方法沒(méi)有方法體
-
覆蓋
: 接口中的方法也可以覆蓋(Override)争舞,但沒(méi)有實(shí)際的意義,因?yàn)榻涌谥胁惶峁┓椒ǖ膶?shí)現(xiàn)
十一澈灼、 接口的新特性——默認(rèn)方法和靜態(tài)方法(jdk8之后)
1. 默認(rèn)方法
- 可以在不影響已有類(lèi)的情況下竞川,修改接口
- 可以有方法實(shí)現(xiàn)
- 父類(lèi)中的默認(rèn)方法可以被子接口繼承
- 子接口可以覆蓋父接口中的默認(rèn)方法,甚至還可以把父接口中的默認(rèn)方法覆蓋為抽象方法
- 實(shí)現(xiàn)接口后叁熔,因?yàn)槟J(rèn)方法不是抽象方法委乌,所以可以不重寫(xiě),但是如果開(kāi)發(fā)需要荣回,也可以重寫(xiě)
- 默認(rèn)方法使用
default
關(guān)鍵字福澡,只能通過(guò)接口實(shí)現(xiàn)類(lèi)的對(duì)象
來(lái)調(diào)用。 - 注意:默認(rèn)方法的訪問(wèn)權(quán)限也是默認(rèn)
public
2. 靜態(tài)方法
- 可以有方法實(shí)現(xiàn)
- 可以直接通過(guò)
接口名
來(lái)訪問(wèn) - 靜態(tài)方法沒(méi)有方法覆蓋驹马,因?yàn)殪o態(tài)方法沒(méi)有運(yùn)行時(shí)多態(tài)
interface Test{
//這個(gè)是默認(rèn)方法
default String get(String aa){
System.out.println("我是jdk1.8默認(rèn)實(shí)現(xiàn)方法...");
return "";
}
//這個(gè)是靜態(tài)方法
static void staticmethod(){
System.out.println("我是靜態(tài)方法");
}
}
3. 注意事項(xiàng)
- 接口默認(rèn)方法革砸、靜態(tài)方法可以有多個(gè)除秀。
- 默認(rèn)方法通過(guò)實(shí)例調(diào)用,靜態(tài)方法通過(guò)接口名調(diào)用算利。
-
default
默認(rèn)方法關(guān)鍵字只能用在接口中册踩。 - 默認(rèn)方法可以被繼承,如果繼承了多個(gè)接口效拭,多個(gè)接口都定義了多個(gè)同樣的默認(rèn)方法暂吉,實(shí)現(xiàn)類(lèi)需要重寫(xiě)默認(rèn)方法不然會(huì)報(bào)錯(cuò)。
- 靜態(tài)方法不能被繼承及覆蓋缎患,所以只被具體所在的接口調(diào)用慕的。
十二、 標(biāo)記接口
- 標(biāo)記接口是
沒(méi)有任何方法和屬性
的接口. - 它僅僅表明它的類(lèi)屬于一個(gè)特定的類(lèi)型,供其他代碼來(lái)測(cè)試允許做一些事情挤渔。
- 標(biāo)記接口作用:簡(jiǎn)單形象的說(shuō)就是給某個(gè)對(duì)象打個(gè)標(biāo)(蓋個(gè)戳)肮街,使對(duì)象擁有某個(gè)或某些特權(quán)。
- 例如:java.awt.event 包中的 MouseListener 接口繼承的 java.util.EventListener 接口定義如下:
package java.util;
public interface EventListener {
}
- 標(biāo)記接口主要用于以下兩種
目的
:建立一個(gè)公共的父接口:
正如EventListener接口判导,這是由幾十個(gè)其他接口擴(kuò)展的Java API嫉父,你可以使用一個(gè)標(biāo)記接口來(lái)建立一組接口的父接口。 例如:當(dāng)一個(gè)接口繼承了EventListener接口眼刃,Java虛擬機(jī)(JVM)就知道該接口將要被用于一個(gè)事件的代理方案绕辖。向一個(gè)類(lèi)添加數(shù)據(jù)類(lèi)型:
這種情況是標(biāo)記接口最初的目的,實(shí)現(xiàn)標(biāo)記接口的類(lèi)不需要定義任何接口方法(因?yàn)闃?biāo)記接口根本就沒(méi)有方法)擂红,但是該類(lèi)通過(guò)多態(tài)性變成一個(gè)接口類(lèi)型仪际。