----《第一季Kotlin崛起:次世代Android開發(fā) 》學(xué)習(xí)筆記
總目錄:每天學(xué)一點(diǎn) Kotlin ---- 目錄
上一篇:每天學(xué)一點(diǎn) Kotlin -- 類的進(jìn)階:接口
下一篇:每天學(xué)一點(diǎn) Kotlin -- 類的進(jìn)階:擴(kuò)展
1. 修飾符
1.1 在 Kotlin 中,修飾符有:open/final,private/protected/internal/public
1.2 open/final:一個(gè)類能不能被繼承。
1.3 private/protected/internal/public:一個(gè)類中或 Kotlin 文件中的變量或方法能不能被其他類或其他 Kotlin 文件訪問。
2. open/final
2.1 一個(gè)類在類的定義前加上 open 修飾符才可以被繼承。如果沒有加 open 關(guān)鍵字,那么默認(rèn)是 final,即不可被繼承的。
2.2 被 open 修飾的類中只有被 open 修飾的屬性或方法才可以被子類重寫,如果在屬性或方法前沒有加 open 關(guān)鍵字,那么默認(rèn)是 final,是不可被覆蓋重寫的。
2.3 在子類中覆蓋重寫父類中的屬性或方法是,需要使用關(guān)鍵字 override 修飾。
2.4 子類中重寫了父類的屬性或方法,那么此時(shí)子類中的屬性或方法沒有加 open 關(guān)鍵字,子類的子類也是可以重寫的,也就是 override 默認(rèn)是 open 的。如果不想被子類的子類進(jìn)行重寫,需要顯示用 final 修飾。 舉個(gè)栗子:
class ModifierSmallStudent : ModifierStudent() {
override var name: String = "small student-name"
// override var age: Int = 8 // 報(bào)錯(cuò)了,不能重寫
override var studentId: Int = 100
override fun printInfo() {
super.printInfo()
println("I am a small student")
}
}
open class ModifierStudent : ModifierPerson() {
override var name: String = "student-name"
final override var age: Int = 10;
open var studentId: Int = 0;
override fun printInfo() {
super.printInfo()
println("student id = ${studentId}")
}
}
open class ModifierPerson {
open var name: String = ""
open var age: Int = 0;
open fun printInfo() = println("name: ${name}, age = ${age}")
}
2.5 在 Kotlin 中,接口不需要加上 open 修飾符。接口本身和它內(nèi)部的方法和屬性都是默認(rèn)加上 open 修飾符的,而普通類默認(rèn)是加上 final 修飾符。而且在接口中也不能手動(dòng)加上 final 修飾符,因?yàn)榻涌诘淖饔镁褪菫榱顺橄?,如果不能被賦值或?qū)崿F(xiàn),那么接口就沒用了。
3. private/protected/internal/public
3.1 這4個(gè)修飾符為可見性修飾符。
(1) 如果用 private 修飾,那么只能在這個(gè)類的內(nèi)部(包含其所有成員)可見;
(2) 如果用 protected 修飾,不但可以在類內(nèi)部可見,在子類中也可見;
(3) 如果用 internal 修飾,則類聲明的本模塊內(nèi)的客戶端都可見(模塊的概念同 Java 中包的概念);
(4) 如果用 public 修飾,則任何地方可見。
3.2 在類的外部如何訪問 private 修飾的屬性,很簡(jiǎn)單,提供一個(gè)對(duì)外的方法就可以了。原理同 Java 中的 getter 和 setter 方法。
3.3 在 Kotlin 中,如果沒有顯示指定 private/protected/internal/public 這幾個(gè)修飾符,那么默認(rèn)是 public。
3.4 上面的四種可見性修飾符不僅可以用在類中,也可以用在全局變量中,即在 Kotlin 文件中也是可以的。