接口
定義:接口就是一種公共的規(guī)范標(biāo)準(zhǔn)待侵,只要符合規(guī)范捡鱼,大家可以通用爹脾,意義在于制定規(guī)范和做功能的拓展
特點(diǎn)
- 接口使用關(guān)鍵字interface 修飾
- 類(lèi)實(shí)現(xiàn)接口用implements表示
- 接口不能實(shí)例化
- 實(shí)現(xiàn)接口必須實(shí)現(xiàn)接口中的所有抽象方法救氯,除非這個(gè)類(lèi)是抽象類(lèi)
成員特點(diǎn)
- 成員變量 :只能是常量
- 構(gòu)造方法: 沒(méi)有
- 成員方法:只能是抽象方法
JDK8以后接口又新加了一些新方法 - 默認(rèn)方法 為了解決接口升級(jí)問(wèn)題
public default void show3() {
}
默認(rèn)方法不是抽象方法,所以不強(qiáng)制被重寫(xiě)不恭。但是可以被重寫(xiě)叶雹,重寫(xiě)的時(shí)候去掉default關(guān)鍵字
public可以省略,default不能省略
如果實(shí)現(xiàn)了多個(gè)接口换吧,多個(gè)接口中存在相同的方法聲明折晦,子類(lèi)就必須對(duì)該方法進(jìn)行重寫(xiě)
- 靜態(tài)方法
public static void show() {
}
靜態(tài)方法只能通過(guò)接口名調(diào)用,不能通過(guò)實(shí)現(xiàn)類(lèi)名或者對(duì)象名調(diào)用
public可以省略沾瓦,static不能省略
- 私有方法
產(chǎn)生原因
Java 9中新增了帶方法體的私有方法满着,這其實(shí)在Java 8中就埋下了伏筆:Java 8允許在接口中定義帶方法體的默認(rèn)方法和靜態(tài)方法。這樣可能就會(huì)引發(fā)一個(gè)問(wèn)題:當(dāng)兩個(gè)默認(rèn)方法或者靜態(tài)方法中包含一段相同的代碼實(shí)現(xiàn)時(shí)贯莺,程序必然考慮將這段實(shí)現(xiàn)代碼抽取成一個(gè)共性方法风喇,而這個(gè)共性方法是不需要讓別人使用的,因此用私有給隱藏起來(lái)乖篷,這就是Java 9增加私有方法的必然性
private static void method() { //static可以省略
}
默認(rèn)方法可以調(diào)用私有的靜態(tài)方法和非靜態(tài)方法
靜態(tài)方法只能調(diào)用私有的靜態(tài)方法
抽象類(lèi)
概述
抽象類(lèi)的出現(xiàn)响驴,是因?yàn)樵谧鲎宇?lèi)共性?xún)?nèi)容抽取的時(shí)候透且,發(fā)現(xiàn)有些內(nèi)容在父類(lèi)中并沒(méi)有具體的實(shí)現(xiàn)撕蔼,就需要無(wú)方法體的抽象方法
特點(diǎn)
- 抽象類(lèi)中不一定有抽象方法豁鲤,由抽象方法的類(lèi)一定是抽象類(lèi)
- 抽象類(lèi)不能實(shí)例化(關(guān)鍵字為abstract)
- 抽象類(lèi)可以有構(gòu)造方法
- 抽象類(lèi)的子類(lèi) 要么重寫(xiě)抽象類(lèi)中的所有方法,要么是抽象類(lèi)
相同點(diǎn)
- 都不能被實(shí)例化
- 接口的實(shí)現(xiàn)類(lèi)或抽象類(lèi)的子類(lèi)都只有實(shí)現(xiàn)了接口或抽象類(lèi)中的方法后才能實(shí)例化鲸沮。
不同點(diǎn)
- 接口只有定義琳骡,不能有方法的實(shí)現(xiàn),java 1.8中可以定義default方法體讼溺,而抽象類(lèi)可以有定義與實(shí)現(xiàn)楣号,方法可在抽象類(lèi)中實(shí)現(xiàn)。
- 實(shí)現(xiàn)接口的關(guān)鍵字為implements怒坯,繼承抽象類(lèi)的關(guān)鍵字為extends炫狱。一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口,但一個(gè)類(lèi)只能繼承一個(gè)抽象類(lèi)剔猿。所以视译,使用接口可以間接地實(shí)現(xiàn)多重繼承。
- 接口強(qiáng)調(diào)特定功能的實(shí)現(xiàn)归敬,而抽象類(lèi)強(qiáng)調(diào)所屬關(guān)系酷含。
- 接口成員變量默認(rèn)為public static final,必須賦初值汪茧,不能被修改椅亚;其所有的成員方法都是public、abstract的舱污。抽象類(lèi)中成員變量默認(rèn)default呀舔,可在子類(lèi)中被重新定義,也可被重新賦值扩灯;抽象方法被abstract修飾别威,不能被private、static驴剔、synchronized和native等修飾省古,必須以分號(hào)結(jié)尾,不帶花括號(hào)丧失。