1 Kotlin 使用 class 關(guān)鍵字聲明類(lèi)
//empty class
class ClassEmpty{
}
//如果一個(gè)類(lèi)沒(méi)有類(lèi)體隔显,可以省略花括號(hào)
class ClassEmptyNoBody
2 構(gòu)造函數(shù)
一個(gè)類(lèi)可以有一個(gè)主構(gòu)造函數(shù)和多個(gè)次構(gòu)造函數(shù)
主構(gòu)造函數(shù)是類(lèi)頭的一部分趣避,跟在類(lèi)名后
class ClassConstructor constructor(arg: String){
}
//如果主構(gòu)造函數(shù)沒(méi)有任何注解或可見(jiàn)性修飾粘优,可以省略 constructor 關(guān)鍵字
class ClassConstructorA(arg: String)
//修飾私有構(gòu)造函數(shù)啡氢,則 constructor 關(guān)鍵字不可省略
class ClassConstructorB private constructor(arg: String)
//主構(gòu)造函數(shù)不能包含代碼孩等,初始化代碼可以放在init關(guān)鍵字的初始化塊
class ClassConstructorC constructor(arg: String){
private var name: String
init {
name = arg
println("$name")
}
}
3 初始化順序
實(shí)例初始化期間斥赋,初始化塊按照類(lèi)體中順序執(zhí)行
class ClassConstructorD constructor(arg: String){
val property1 = "1) property1 : $arg".also(::println)
init {
println("2) init block1 ${arg}")
}
val property2 = "3) property2 : $arg".also(::println)
init {
println("4) init block2 ${arg}")
}
}
4 次級(jí)構(gòu)造函數(shù)
如果類(lèi)有一個(gè)主構(gòu)造函數(shù),次級(jí)構(gòu)造函數(shù)需要委托給主構(gòu)造函數(shù)
可以直接委托或者通過(guò)其他次構(gòu)造函數(shù)間接委托
class ClassSecondaryConstructor constructor(arg: String){
constructor(property1: String, property2: String) : this(property1) {
}
constructor(property1: String, property2: String, property3: String) : this(property1, property2) {
}
}
//初始化塊中代碼實(shí)際上會(huì)成為主構(gòu)造函數(shù)一部分
//委托給主構(gòu)造函數(shù)會(huì)作為次構(gòu)造函數(shù)的第一條語(yǔ)句
//即使沒(méi)有主構(gòu)造函數(shù)氛琢,這種委托扔會(huì)隱式發(fā)生
class ClassSecondaryConstructorA constructor(arg: String){
init {
println("primary init block")
}
constructor(property1: String, property2: String) : this(property1){
println("secondary constructor")
}
}
fun main(args: Array<String>){
//new class
val obj1: ClassEmpty = ClassEmpty()
val obj2: ClassEmptyNoBody = ClassEmptyNoBody()
//構(gòu)造函數(shù)初始化
var obj3: ClassConstructorC = ClassConstructorC("hello kotlin")
//構(gòu)造函數(shù)初始化順序
println("構(gòu)造函數(shù)初始化順序====================================================")
var obj4: ClassConstructorD = ClassConstructorD("kotlin")
//主構(gòu)造函數(shù)委托
println("主構(gòu)造函數(shù)委托====================================================")
var obj5: ClassSecondaryConstructorA = ClassSecondaryConstructorA("hello", "kotlin")
}
hello kotlin
構(gòu)造函數(shù)初始化順序====================================================
1) property1 : kotlin
2) init block1 kotlin
3) property2 : kotlin
4) init block2 kotlin
主構(gòu)造函數(shù)委托====================================================
primary init block
secondary constructor