類的定義
接口 interface
類似 Java8 接口中的方法可以有默認(rèn)實(shí)現(xiàn),但是不需要 default 關(guān)鍵字來標(biāo)識(shí),以是否有方法體的存在來區(qū)分
-
override修飾符,強(qiáng)制要求寫
一個(gè)類實(shí)現(xiàn)多個(gè)接口時(shí),若有相同方法在不同的接口中有默認(rèn)實(shí)現(xiàn),那么在實(shí)現(xiàn)類中要明確重寫這個(gè)方法
//調(diào)用接口的默認(rèn)邏輯,通過<>來指定
super<AInterface>.sum()
super<BInterface>.sum()
Kotlin1.0 是以Java6 為目標(biāo)設(shè)計(jì)的,其并不支持接口中的默認(rèn)方法。因此它會(huì)把每個(gè)帶默認(rèn)方法的接口編譯成一個(gè)普通接口和一個(gè)將方法方法體作為靜態(tài)函數(shù)的類的結(jié)合體。接口中只包含聲明,類中包含了以靜態(tài)方法存在的所有實(shí)現(xiàn)。因此,如果需要在Java類中實(shí)現(xiàn)這樣一個(gè)接口,必須為所有的方法,包括在kotlin中有方法體的方法定義你自己的實(shí)現(xiàn)。
繼承性修飾符 open、final、abstract
因Java中存在脆弱的基類問題,kotlin中類的聲明默認(rèn)是 final的,即不可被繼承的。
- open : 使得類可以被繼承,方法可以被重寫
- abstract:抽象類,抽象方法
- final:禁止類被繼承,禁止方法被重寫
接口中的方法(包括抽象方法,以及默認(rèn)實(shí)現(xiàn)的方法),默認(rèn)都是 open 的。被 override 修飾的方法也默認(rèn)是 open的。當(dāng)然 override 的方法可以顯示的聲明為final 的,禁止被重寫。
可見性修飾符
- public : 默認(rèn)是public
- internal:模塊內(nèi)可見
- protected:子類可見
- private:私有
- kotlin中不存在Java中包私有的概念,即protected 不具有包權(quán)限,僅在其子類中可見
通用規(guī)則:類的基礎(chǔ)類型和類型參數(shù)列表中用到的所有類,或者函數(shù)的簽名都有與這個(gè)類或者函數(shù)本身相同的可見性
類的擴(kuò)展函數(shù)不能訪問它的private 與 protected 成員
kotlin 編譯成字節(jié)碼后與Java的對(duì)應(yīng)關(guān)系:public -> public;internal -> public;protected -> protected;private -> private
所以存在這個(gè)現(xiàn)象:當(dāng)一個(gè)類聲明為internal 或者 protected ,在kotlin中不可訪問的地方,當(dāng)轉(zhuǎn)換為Java時(shí),某些kotlin不可用的場(chǎng)景在Java中確實(shí)可見可訪問的。
嵌套類 內(nèi)部類
默認(rèn)是 嵌套類,對(duì)應(yīng)Java的靜態(tài)內(nèi)部類,即不持有外部類的引用。
- inner : 使得嵌套類變?yōu)閮?nèi)部類,持有外部類的引用
- this@Outer : 通過這種方式來訪問外部類 Outer 的引用
密封類 sealed
委托類 by
關(guān)鍵字 object
Kotlin 中 object 在多種情況下都出現(xiàn),但是他們都遵循一個(gè)核心的理念:
object定義一個(gè)類并同時(shí)創(chuàng)建一個(gè)實(shí)例
- 對(duì)象聲明:是定義單例模式的一種方式
- 伴生對(duì)象:可以持有工廠方法和其他與這個(gè)類相關(guān),但是在調(diào)用時(shí)并不依賴類實(shí)例的方法。它們可以通過類名來訪問
- 對(duì)象表達(dá)式:用來代替Java的匿名內(nèi)部類