Kotlin構造函數
在Kotlin中,構造函數是一個類似於方法的代碼塊。 聲明構造函數的名稱與類的名稱相同,後跟括號()
。 構造函數用於在創建對象時初始化變量。
Kotlin構造函數的類型
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輔助構造函數
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