系列文章全部為本人的學(xué)習(xí)筆記,若有任何不妥之處,隨時歡迎拍磚指正阐虚。如果你覺得我的文章對你有用,歡迎關(guān)注我蚌卤,我們一起學(xué)習(xí)進步实束!
Kotlin學(xué)習(xí)筆記(1)- 環(huán)境配置
Kotlin學(xué)習(xí)筆記(2)- 空安全
Kotlin學(xué)習(xí)筆記(3)- 語法
Kotlin學(xué)習(xí)筆記(4)- 流程控制
Kotlin學(xué)習(xí)筆記(5)- 類
Kotlin學(xué)習(xí)筆記(6)- 屬性
Kotlin學(xué)習(xí)筆記(7)- 接口
Kotlin學(xué)習(xí)筆記(8)- 擴展
Kotlin學(xué)習(xí)筆記(8)- 擴展(續(xù))
Kotlin學(xué)習(xí)筆記(9)- 數(shù)據(jù)類
Kotlin學(xué)習(xí)筆記(10)- 泛型
Kotlin學(xué)習(xí)筆記(11)- 內(nèi)部類和嵌套類
Kotlin學(xué)習(xí)筆記(12)- 委托
Kotlin學(xué)習(xí)筆記(13)- 函數(shù)式編程
Kotlin學(xué)習(xí)筆記(14)- lambda
一奥秆、接口定義
和java一樣,kotlin中的接口也是使用interface
關(guān)鍵字咸灿。
interface Wing{
fun fly()
}
和java不同的是构订,接口的實現(xiàn)不是使用implement
關(guān)鍵字,而是冒號:
避矢,和繼承一樣鲫咽。所以我認為kotlin中的接口是一種特殊的抽象類。
class InterfaceLesson : Wing{
override fun fly() {
}
}
二谷异、方法和屬性
kotlin中的接口可以有方法和屬性分尸,java中也是,我們來說說他們的不同歹嘹。
-
java中的屬性必須初始化箩绍,而且是靜態(tài)常量。kotlin中的屬性默認為
abstract
尺上,在接口中不能初始化材蛛,必須在實現(xiàn)類中進行初始化,并且在初始化時要加override
修飾怎抛。interface Wing{ var count : Int }
-
java中的方法必須為抽象卑吭,需要在實現(xiàn)類中進行實現(xiàn)。kotlin中的方法可以為抽象马绝,也可以有實現(xiàn)豆赏,實現(xiàn)了的方法在具體類中可以不用覆寫。(所以更加讓我覺得這就是一種特殊的抽象類)
interface Wing{ fun fly() { Log.d("text", "Wing -> fly") // 這里實現(xiàn)了接口的方法 } } class InterfaceLesson : Wing{ fun test(){ fly() // 在具體類中可以不用覆寫接口中的實現(xiàn)方法富稻,直接調(diào)用 } } // 輸出 Wing -> fly
三掷邦、繼承
和java一樣,接口可以繼承接口椭赋,類可以實現(xiàn)多個接口抚岗。
有的文章提到kotlin中的接口可以繼承open類,但是現(xiàn)在的版本已經(jīng)不行了哪怔,接口只能繼承接口
四宣蔚、多繼承重載
我們上面已經(jīng)說過,kotlin中接口的方法可以實現(xiàn)认境,并且如果已經(jīng)在接口中實現(xiàn)胚委,子類中可以不實現(xiàn)。接下來說一些特殊情況:如果子類實現(xiàn)了多個接口元暴,而這些接口中有同名方法的處理篷扩。這個在《Kotlin學(xué)習(xí)筆記(5)- 類》中有所提及兄猩,這里多說一些茉盏。
-
如果接口實現(xiàn)了方法鉴未,子類中可以進行覆寫,同時也可以調(diào)用
super
方法調(diào)用接口的實現(xiàn)interface Wing{ fun fly() { Log.d("text", "Wing -> fly") } } open class InterfaceLesson : Wing{ override fun fly() { super.fly() } }
-
如果接口沒實現(xiàn)方法鸠姨,子類必須進行實現(xiàn)铜秆,且不能調(diào)用
super
interface Wing{ fun fly() } class InterfaceLesson : Wing{ override fun fly() { } }
-
如果多個接口有相同的方法,無論接口中是否實現(xiàn)讶迁,子類都必須實現(xiàn)該方法连茧。其中,如果兩個接口中都沒有實現(xiàn)巍糯,則子類不能使用
super
關(guān)鍵字interface Foot{ fun run() } interface Car{ fun run() } class InterfaceLesson : Foot, Car{ override fun run() { } }
如果有一個類有實現(xiàn)啸驯,則子類可以使用
super
關(guān)鍵字,且自動調(diào)用實現(xiàn)的方法祟峦。interface Foot{ fun run() } interface Car{ fun run() { Log.d("text", "Car -> run1") } } class InterfaceLesson : Foot, Car{ override fun run() { super.run() } } // 輸出 Car -> run1
如果兩個接口都實現(xiàn)了該方法罚斗,則子類在調(diào)用
super
的時候需要使用尖括號對調(diào)用的父方法進行聲明。interface Foot{ fun run() { Log.d("text", "Foot -> run") } } interface Car{ fun run() { Log.d("text", "Car -> run1") } } class InterfaceLesson : Foot, Car{ override fun run() { super<Foot>.run() } } // 輸出 Foot -> run