類聲明
Kotlin使用class關鍵字聲明類:
class Invoice{
}
Kotlin類聲明基本包括header與body:
[<Modifier>] <class> [<Visibility modifiers>] <className> [<constructor>]
[< body>]
構造器
kotlin的類能有一個主要的構造器與多個次要的構造器。主構造器出現在類名的后面參數是可選的。
class Person constructor(firstName: String){
...
}
如果主構造器沒有注解或可見修飾符constructor關鍵字可以省略:
class Person(firstName: String){
...
}
Kotlin能夠使用constructor聲明多個次要的構造器:
class Person{
constructor(parent: Person){
}
constructor(name: String, parent: Person){
}
}
如果類有一個主構造器其他的構造器都需要去直接或間接的調用它:
class Person(val name: String){
constructor(name: String, parent: Person): this(name){
}
}
創建實例
Kotlin沒有new關鍵字,創建類的實例只需要調用對應的構造方法:
val invoice = Invoice()
val person = Person("xx")
繼承
所有的class有一個共同的超類Any如果類聲明時沒有指定超類默認繼承Any:
class Empty //默認繼承Any
繼承一個指定的類通過在class header后面添加冒號與父類:
open class Base(p: Int)
class Derived(p: Int): Base(p) //指定構造器
如果子類有主構造器可以在class header中初始化超類,如果該類沒有主構造器由其他的構造器通過super關鍵字直接或間接始化超類:
open class Base(p: Int)
class Derived: Base{
constructor(p: Int): super(p){
}
}
open注解與java中的final相反表示類是否可以被繼承,Kotlin中所有的類默認是final。
重寫成員方法
Kotlin使用open標記成員是否可被重寫,override顯示說明該成員重寫父類方法:
open class Base {
open fun v() {}
fun nv() {}
}
class Derived() : Base() {
override fun v() {}
}
屬性
聲明屬性語法:
var <propertyName>: <PropertyType> [= <property_initializer>]
[<getter>]
[<setter>]
除了初始化和getter/setter是可選的以外屬性類型如果能夠推斷出的話也可以省略。只讀屬性的聲明
語法與可讀屬性聲明只有兩個差別:使用val替換var、沒有setter。
Kotlin中的類聲明可變的(var)屬性與只讀(val)屬性:
class Person{
public var name: String = ""
public val IdCard: String = "xxx"
}
通過屬性名稱使用類中的屬性,類似Java中的Field:
fun out(p: Person){
println("name: ${p.name}")
println("id: ${p.id}")
}
getter/setter:
public var name: String
get() = "undefined"
set(value) {
}
如果只需要重新定義getter/setter的可見性或注解它們但不需要去更改它們行為可以只定義getter/setter不需要定義主體:
public var name: String = ""
get() = "undefined"
private @Inject set
Kotlin中不能有field,但是在自定義getter/setter的時候可能需要去直接訪問屬性而不是通過getter/settter。Kotlin自動提供
一個備用字段(field),通過它使用使用屬性標識符來訪問它。
public var fieldProp = ""
get() = field
set(value) {
field = value;
}
編譯時常量
如果屬性能在編譯時就已經確定它的值可以使用const關鍵字聲明一個編譯時常量但它需要滿足以下要求:
- 只要出現在最頂層或對象內部
- 只支持
String與原始類型 - 無法算自定義getter
const val COMPILE_CONSTANT = ""
《架構文摘》每天一篇架構領域重磅好文,涉及一線互聯網公司應用架構(高可用、高性 能、高穩定)、大數據、機器學習等各個熱門領域。

