在Kotlin中,建構函式是一個類似於方法的程式碼塊。 宣告建構函式的名稱與類的名稱相同,後跟括號()
。 建構函式用於在建立物件時初始化變數。
Kotlin中有兩種型別的建構函式:
Kotlin類中只有一個主要建構函式,而輔助建構函式可以是一個或多個。
主建構函式用於初始化類,它在類標題中宣告。 主建構函式程式碼由帶有可選引數的括號括起。
下面來看看一個主建構函式宣告的例子。 在下面的程式碼中,我們宣告了一個帶有兩個引數:name
和id
的建構函式myClass
。 引數name
是唯讀屬性,而id
是讀取和寫入屬性。
class myClass(valname: String,varid: Int) {
// class body
}
當建立myClasss
的物件時,分別使用:Susen
和10010
這兩個值來初始化name
和id
屬性。
class myClass(val name: String, var id: Int) {
}
fun main(args: Array<String>){
val myclass = myClass ("Susen", 10010)
println("Name = ${ myclass.name}")
println("Id = ${ myclass.id}")
}
執行上面範例程式碼,得到以下結果 -
Name = Susen
Id = 10010
主建構函式不包含任何程式碼,初始化程式塊用於初始化程式碼。 該塊是以init
關鍵字為字首。 在範例初始化期間,初始化塊的執行順序與它們在類體中出現的順序相同。
下面使用初始化塊重寫上面的程式碼:
class myClass(name: String, id: Int) {
val e_name: String
var e_id: Int
init{
e_name = name.capitalize()
e_id = id
println("Name = ${e_name}")
println("Id = ${e_id}")
}
}
fun main(args: Array<String>){
val myclass = myClass ("Maxsu", 10010)
}
執行上面範例程式碼,得到以下結果 -
Name = Maxsu
Id = 10010
在上面的程式碼中,引數name
和id
在建立myclass
物件時接受值分別是:Maxsu
和10010
。 宣告name
和id
屬性時沒有val
或var
,因此它們不是myClass
類的屬性。
當建立myClass
類的物件時,它將執行初始化塊,初始化name
和e_id
。
Kotlin在類中建立一個或多個輔助建構函式。 使用constructor
關鍵字建立輔助建構函式。
下面來看一個輔助建構函式宣告的範例。在下面的程式碼中,我們宣告了myClass
的兩個建構函式,它有兩個引數:name
和id
。
class myClass{
constructor(id: Int){
//code
}
constructor(name: String, id: Int){
//code
}
}
讓我們看一下輔助建構函式在建立類的物件時分配值的範例。
class myClass{
constructor(name: String, id: Int){
println("Name = ${name}")
println("Id = ${id}")
}
}
fun main(args: Array<String>){
val myclass = myClass ("Maxsu", 10010)
}
執行上面範例程式碼,得到以下結果 -
Name = Maxsu
Id = 10010
也可以在同一個類中使用主和輔助建構函式。 通過在同一個類中使用主和輔助建構函式,輔助建構函式需要授權給主建構函式。 使用this()
關鍵字對同一個類中的另一個建構函式進行授權。
例如:
class myClass(password: String){
constructor(name: String, id: Int, password: String): this(password){
println("Name = ${name}")
println("Id = ${id}")
println("Password = ${password}")
}
}
fun main(args: Array<String>){
val myclass = myClass ("Maxsu", 101, "passwd123")
}
執行上面範例程式碼,得到以下結果 -
Name = Maxsu
Id = 101
Password = passwd123
從同一個類的一個輔助建構函式呼叫另一個輔助建構函式
在Kotlin中,一個輔助建構函式可以呼叫同一個類的另一個輔助建構函式。 可通過使用this()
關鍵字完成的。
例如:
class myClass{
constructor(name: String, id: Int): this(name,id, "mypassword"){
println("第二個執行")
println("Name = ${name}")
println("Id = ${id}")
}
constructor(name: String, id: Int,pass: String){
println("第一個執行")
println("Name = ${name}")
println("Id = ${id}")
println("Password = ${pass}")
}
}
fun main(args: Array<String>){
val myclass = myClass ("Maxsu", 10010)
}
執行上面範例程式碼,得到以下結果 -
第一個執行
Name = Maxsu
Id = 10010
Password = mypassword
第二個執行
Name = Maxsu
Id = 10010
從派生類輔助建構函式呼叫超類輔助建構函式
在Kotlin中,一個派生類的輔助建構函式可以呼叫基礎類別的輔助建構函式。可使用super
關鍵字完成的,它是繼承的概念。
open class Parent{
constructor(name: String, id: Int){
println("第一個執行")
println("Name = ${name}")
println("Id = ${id}")
}
constructor(name: String, id: Int,pass: String){
println("第三個執行")
println("Name = ${name}")
println("Id = ${id}")
println("Password = ${pass}")
}
}
class Child: Parent{
constructor(name: String, id: Int): super(name,id){
println("第二個執行")
println("Name = ${name}")
println("Id = ${id}")
}
constructor(name: String, id: Int,pass: String):super(name,id,"password"){
println("第四個執行")
println("Name = ${name}")
println("Id = ${id}")
println("Password = ${pass}")
}
}
fun main(args: Array<String>){
val obj1 = Child("Susen", 10010)
val obj2 = Child("Susen", 10010,"mypassword")
}
執行上面範例程式碼,得到以下結果 -
第一個執行
Name = Susen
Id = 10010
第二個執行
Name = Susen
Id = 10010
第三個執行
Name = Susen
Id = 10010
Password = password
第四個執行
Name = Susen
Id = 10010
Password = mypassword