天天看點

十一、Kotlin學習之構造方法

一、初始化類:主構造方法和初始化語句塊

通常來講,類的所有聲明應該在花括号裡面。這裡面被括号括起來的叫主構造方法

主構造方法主要目的:

  • 1.表明構造函數參數;
  • 2.定義使用這些參數初始化屬性

讓我們來揭示他的工作原理:

class Animal constructor(_name: String) {//帶一個參數的主構造函數
    val name: String

    init {//初始化函數
        name = _name
    }
}
           

在上面的代碼中,可以看到兩個新的kotlin關鍵字:constructor&init。

constructor關鍵字用開始一個構造方法的聲明。

init關鍵字用來引入一個初始化語句塊,并會與主構造方法一起使用。因為主構造語句有文法限制,不能包含初始化代碼,這就是為什麼使用初始化語句塊的原因。

在這個例子中,不需要把初始化代碼放在初始化語句塊中,因為他可以和name屬性結合。如果主構造沒有注解或可見性修飾符,同樣可以将constructor關鍵字省略。

是以簡化後的代碼如下

class Animal(_name: String) {//帶一個參數的主構造
    val name = _name//用參數來初始化屬性
}
           

這就是聲明同樣的類的另一種方法。如果屬性可以通過構造方法初始化,代碼可以通過吧val關鍵字加到構造方法參數之前的方式來簡化。

這樣就可以簡化成如下代碼:

構造參數也可以想函數一樣生命一個預設值:

class Animal(var _name: String, var age : Int = 3)

fun main() {
    Animal("lynnlee", 2)
    Animal(name = "lynnlee", age = 2)//命名參數
    Animal("lynnlee")//第二個參數使用預設值3
}
           

如果你的類具有一個父類,主構造方法同樣需要初始化父類。

open class Animal(var name: String, var age: Int = 3)

class Cat(name: String) : Animal(name)//Cat聲明主構造參數不要var/val,因為是父類的屬性,不需要setter&getter

fun main() {
    Cat("temo")
}
           

如果繼承了Animal類,必須顯示地調用父類的構造方法,即使他沒有任何參數,這就是為什麼在父類後買你還帶一個括号的原因。注意和接口的差別,接口沒有構造,是以不需要跟括号。

open class Animal

class Cat : Animal()//必須帶口号
           

如果你要確定你的類不會被别人執行個體化,必須把構造方法标記為private。

class Animal private constructor()

fun main() {
    Animal()//報錯,無法執行個體化
}