Kotlin建構函式


在Kotlin中,建構函式是一個類似於方法的程式碼塊。 宣告建構函式的名稱與類的名稱相同,後跟括號()。 建構函式用於在建立物件時初始化變數。

Kotlin建構函式的型別

Kotlin中有兩種型別的建構函式:

  • 主建構函式
  • 輔助建構函式

Kotlin類中只有一個主要建構函式,而輔助建構函式可以是一個或多個。

Kotlin主建構函式

主建構函式用於初始化類,它在類標題中宣告。 主建構函式程式碼由帶有可選引數的括號括起。

下面來看看一個主建構函式宣告的例子。 在下面的程式碼中,我們宣告了一個帶有兩個引數:nameid的建構函式myClass。 引數name是唯讀屬性,而id是讀取和寫入屬性。

class myClass(valname: String,varid: Int) {  
    // class body  
}

當建立myClasss的物件時,分別使用:Susen10010這兩個值來初始化nameid屬性。

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

在上面的程式碼中,引數nameid在建立myclass物件時接受值分別是:Maxsu10010。 宣告nameid屬性時沒有valvar,因此它們不是myClass類的屬性。

當建立myClass類的物件時,它將執行初始化塊,初始化namee_id

Kotlin輔助建構函式

Kotlin在類中建立一個或多個輔助建構函式。 使用constructor關鍵字建立輔助建構函式。

下面來看一個輔助建構函式宣告的範例。在下面的程式碼中,我們宣告了myClass的兩個建構函式,它有兩個引數:nameid

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