Kotlin 和 Java 兼容迅脐, 面向?qū)ο蟮南嚓P(guān)概念一致, 類的定義豪嗽、繼承谴蔑、成員等和 Java 區(qū)別不大豌骏,Kotlin 的寫法比 Java 簡潔一些。類中可包含函數(shù)隐锭、屬性窃躲、內(nèi)部類、伴隨對象钦睡。
class Persion constructor(firstName: String) {
private val name = firstName
fun main() {...}
}
- 構(gòu)造器和初始化
Kotlin 構(gòu)造器關(guān)鍵字 constructor 聲明蒂窒, 如果沒有可見性、注解等修飾荞怒,可省略 constructor洒琢。和 Java 具有構(gòu)造函數(shù)不一樣, Kotlin的構(gòu)造器只有聲明褐桌, 初始化代碼可放到 init 塊衰抑。
class Persion(nameValue: String, ageValue: Int) {
private val name: String
private val age: Int
init {
name = firstName
age = if (ageValue > 0 && ageValue < 150) ageValue else 1
}
}
Java 可以為類定義多個構(gòu)造函數(shù), Kotlin 也可以荧嵌, 但不一樣的是呛踊, Kotlin 的構(gòu)造器有主次之分。Kotlin只有一個主構(gòu)造器完丽,如上代碼所示就是主構(gòu)造器恋技, 次級構(gòu)造器必須直接或者間接調(diào)用主構(gòu)造器,示例:
class Persion(val name: String, val age: Int) {
constructor(name: String): this(name, 1)
}
主構(gòu)造器不能帶函數(shù)體逻族,次級構(gòu)造器可帶函數(shù)體蜻底。如果主構(gòu)造器沒有參數(shù),可省略聘鳞,編譯器會自動生成無參構(gòu)造器薄辅。
class Persion {
private var name: String? = null
contructor(name: String) {
this.name = name
}
init {
// do something
}
}
- 繼承
Kotlin 類可以繼承 open 的類和接口, 如果沒有繼承抠璃,默認繼承 Any站楚, Any 相當于 Java 的 Object 類, 是所有類的基類搏嗡。
和 Java 不同窿春, Kotlin 類默認是 final 的, 要允許被繼承采盒,需要顯式聲明為 open旧乞,抽象類默認是 open 的。
類的方法也類似磅氨, 允許被重載需要 open 聲明尺栖。
open class Base {
open fun v() {...}
}
abstract class Davad: Base() {
abstract fun f()
fun h() {...} // 不能被重載
}
class Hello: Davad() {
@override
fun f() { ... }
@override
fun v() {
super.v()
...
}
}
- 嵌套類和內(nèi)部類
Java里面, 默認的嵌套類是內(nèi)部類烦租,可以訪問外部類的成員延赌。 但是嵌套類有 static 修飾時除盏, 就不是內(nèi)部類,只是嵌套類挫以。
Kotlin 的語法有點不一樣者蠕, 默認只是嵌套類, 內(nèi)部類要用 inner 聲明屡贺。
class Outer {
private val x = 10
inner class Inner {
fun f() = x * x
}
}
內(nèi)部類訪問 this 通過限定符 this@Outer
- 匿名內(nèi)部類
Kotin 的匿名內(nèi)部類和 Java 的語法上有點不一樣蠢棱,示例:
val listener = object : OnItemClickListener() {
override fun onSimpleItemClick(adapt: BaseQuickAdapter<*, *>, view: View, position: Int) {
// do something
}
}
- 數(shù)據(jù)類
經(jīng)常會創(chuàng)建一些數(shù)據(jù)類, 什么功能也沒有, 而僅僅用來保存數(shù)據(jù)。某些常見的功能經(jīng)乘φ唬可以由類中保存的數(shù)據(jù)內(nèi)容即可自動推斷得到。
data class User(val name: String, val age: Int)
編譯器會根據(jù)主構(gòu)造器中聲明的全部屬性, 自動推斷產(chǎn)生以下成員函數(shù): equals(), toString(), copy() 等糕再。
- 枚舉類
枚舉類的定義量没,和 Java 類似, 也可以帶定義帶參數(shù)的構(gòu)造器
enum class Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}
enum class Code(val code: Int, val msg: String) { SUCESS(0, "sucess"), FAIL(-1, "fail")}
參考
《Programming Kotlin》Stephen Samuel 突想,Stefan Bocutiu
《Kotlin in Action》Dmitry Jemerov殴蹄,Svetlana Isakova