天天看點

Kotlin普通類的聲明和構造函數

Kotlin中類的聲明使用class關鍵字,  在class後面跟類名即可例如:

class Empty

class Stu {
    fun getName() : String {
       return "default"
    }
}

class stud {
    fun getAge() : Int {
        return 0
    }
}
           

上面這段代碼共建立了三個類, 第一個是一個空類, 第二個和第三個是正常的類, 可以看到類名首字母大寫或小寫都可以, 但是還是大寫比較合适.

        kotlin中類的構造函數和java中略有不同, kotlin中構造函數分為主構造函數和次構造函數, 主構造函數是解除安裝類名後面, 例如:

class Student2 constructor(name : String) {
    init {
        println("name is : $name")
    }
}
           

Student2類的主構造函數隻有一個String類型的name參數, 2~4行為主構造函數的代碼塊

fun main(args: Array<String>) {
    val stu = Student2("小明")
}
           

執行這段代碼就會列印"name is 小明"也就是會執行init的代碼塊中的代碼, 是以可以在init裡對屬性做初始化例如:

class Student2 constructor(name : String, age : Int) {
    var nameStr : String = "default"
    var ageInt = 0
    init {
        nameStr = name
        ageInt = age
        println("name is : $name")
    }
}
           

甚至可以直接給類的成員變量指派例如:

class Student2 constructor(name : String, age : Int) {
    var nameStr = name
    var ageInt = age
    init {
        println("name is : $nameStr , age is $ageInt")
    }
}
           

更簡單的寫法, 可以直接把類的成員變量聲明在構造函數中例如:

class Student2 constructor(val name : String, val age : Int) {
    init {
        println("name is : $name , age is $age") // name is : 小明 , age is 10
    }
}

fun main(args: Array<String>) {
    val stu = Student2("小明", 10)
    println(stu.name + " " + stu.age) // 小明 10
}
           

一種簡單的寫法, 可以主構造器可以省略constructor關鍵字:

class Student2 (val name : String, val age : Int) {
    init {
        println("name is : $name , age is $age")
    }
}
           

注意: 果構造器有注解,或者有可見度修飾符,這時constructor關鍵字是必須的,注解和修飾符要放在它之前, 例如如下這種寫法:

class Student2 private (val name : String, val age : Int) {
    init {
        println("name is : $name , age is $age")
    }
    constructor(name : String) : this(name, 20)
}
           

這種寫法會提示如下錯誤:

Error:(22, 16) Kotlin: Use 'constructor' keyword after modifiers of primary constructor

我們做這樣的修改就可以了:

class Student2 private (val name : String, val age : Int) {
    init {
        println("name is : $name , age is $age")
    }
    constructor(name : String) : this(name, 20)
}

fun main(args: Array<String>) {
    val stu = Student2("小明")
    println(stu.name + " " + stu.age)
}
           

例子中我們的主構造器定義成了private類型,  但在類内部定義了一個從構造器(第5行), 利用this關鍵字 調用了雙參數的主構造器, 并給類的成員變量name和age進行了指派