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