為什么要有接口?
????只有部分子類有的共性,無法將其抽取到父類中,但為了統(tǒng)一有此共性的子類書寫的規(guī)則,所以有接口.
????接口就是一種規(guī)則,是對行為的抽象.
接口的定義和使用
? ? (1)接口用關(guān)鍵字interface來定義
? ? ????public interface 接口名{}
? ? (2)接口不能實例化
? ? (3)接口和類之間是實現(xiàn)關(guān)系,通過implements關(guān)鍵字表示
? ? ? ? public class 類名 implements 接口名{}
? ? (4)接口的子類(實現(xiàn)類)
? ? ? ? 要么重寫接口中的所有抽象方法
? ? ? ? 要么是抽象類
注意1:接口和類的實現(xiàn)關(guān)系,可以單實現(xiàn),也可以多實現(xiàn).
? ? ? ? ? ? pblic class 類名 implements 接口1,接口2{}
注意2:實現(xiàn)類還可以在繼承一個類的同時實現(xiàn)多個接口.
? ? ? ? ? ? public class 類名 extends 父類 implements 接口名1,接口名2{}
接口中成員的特點
????(1)成員變量
? ? ? ? ? ? 只能是常量,默認修飾符: public static final
? ? (2)構(gòu)造方法
? ? ? ? ? ? 沒有
? ? (3)成員方法
? ? ? ? ? ? 只能是抽象方法,默認修飾符: public abstract
JDK7以前: 接口中只能定義抽象方法.
JDK8的新特性: 接口中可以定義有方法體的方法.(默認,靜態(tài)) (為了解決在接口升級時,就需要在實現(xiàn)該接口的類中重寫在接口中重新添加的方法)
? ? (1)JDK8以后的默認方法
? ? ? ? ? ? 允許在接口中定義默認方法,需要使用關(guān)鍵字default修飾
? ? ? ? ? ? 作用:解決接口升級的問題
? ? ? ? 接口中默認方法的定義格式:? ? (1)格式: public default 返回值類型 方法名(參數(shù)列表){}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2)范例: public default void show(){}
? ? ? ? 接口中默認方法的注意事項:? ? (1)默認方法不是抽象方法,所以不強制被重寫.但是如果被重寫,重寫的方法要去掉default關(guān)鍵字.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2)public可以省略,default不能省略.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (3)如果實現(xiàn)了多個接口,多個接口中存在相同名字的默認方法,子類就必須對該方法進行重寫.
? ? (2)JDK8以后的靜態(tài)方法
? ? ? ? ? ? ? 允許在接口中定義靜態(tài)方法,需要用static修飾
? ? ? ? ? 接口中靜態(tài)方法的定義格式:? ? (1)格式: public static 返回值類型 方法名(參數(shù)列表){}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2)范例: public static void show(){}
? ? ? ? ? 接口中靜態(tài)方法的注意事項:? ? (1)靜態(tài)方法只能通過接口名調(diào)用,不能通過實現(xiàn)類名或者對象名調(diào)用.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2)public可以省略,static不能省略.
JDK9的新特性: 接口中可以定義私有方法.(為了抽取接口中其他方法中相同的部分,同時不希望抽取的方法被外界調(diào)用)
? ? ? ? ? ? ? 接口中私有方法的定義格式:? ? (1)格式1: private 返回值類型 方法名(參數(shù)列表){}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?范例1: private void show(){}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2)格式2: private static 返回值類型 方法名(參數(shù)列表){}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?范例2: private static void mathod(){}?
接口和類之間的關(guān)系
? ??類和類之間的關(guān)系: 繼承關(guān)系,只能單繼承,不能多繼承,但可以多層繼承.
? ??類和接口之間的關(guān)系: 實現(xiàn)關(guān)系,可以單實現(xiàn),也可以多實現(xiàn),還可以在繼承一個類的情況下實現(xiàn)多個接口.
? ??接口和接口之間的關(guān)系: 繼承關(guān)系,可以單繼承,也可以多繼承 (如果實現(xiàn)類實現(xiàn)了最下面的子接口,那么實現(xiàn)類就需要重寫所有方法).
總結(jié)
1. 接口代表規(guī)則, 是行為的抽象. 想要讓哪個類擁有一個行為, 就讓這個類實現(xiàn)對應的接口就可以了.
2. 當一個方法的參數(shù)是接口時, 可以傳遞接口所有實現(xiàn)類的對象, 這種方式稱之為接口的多態(tài).
適配器設(shè)計模式
? ? (1)設(shè)計模式是一套被反復使用, 多數(shù)人知曉的, 經(jīng)過分類編目的, 代碼設(shè)計經(jīng)驗的總結(jié). 使用設(shè)計模式是為了可重用代碼, 讓代碼更容易被他人理解, 保證代碼可靠性, 程序的重用性. (即設(shè)計模式就是各種套路)
? ? (2)適配器設(shè)計模式: 解決接口與接口實現(xiàn)類之間的矛盾問題.
說明
? ? 1. 當一個接口中抽象方法過多, 但是我只要使用其中一部分的時候, 就可以適配器設(shè)計模式.
? ? 2. 書寫步驟:?
? ? ? ? ? ? 編寫中間類XXXAdapter, 實現(xiàn)對應的接口
? ? ? ? ? ? 對接口中的抽象方法進行空實現(xiàn)
? ? ? ? ? ? 讓真正的實現(xiàn)類繼承中間類, 并重寫需要用的方法
? ? ? ? ? ? 為了避免其他類創(chuàng)建適配器類的對象, 中間的適配器類用abstract進行修飾