欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Kotlin類與屬性及構(gòu)造函數(shù)的使用詳解

 更新時間:2022年09月06日 09:50:39   作者:niuyongzhi  
這篇文章主要介紹了Kotlin語言中類與屬性及構(gòu)造函數(shù)的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1.類的屬性 filed

1)在kotlin中定義屬性,必須賦初始值,要不編譯器檢查不通過。這個和java不同

2)kotlin會針對于定義的每個屬性都封裝了一個field,用于存儲數(shù)據(jù)。

3)針對于非private的var(可變)屬性,kotlin默認(rèn)會生成一組getter和setter方法,通過反編生成的byteCode代碼可以看到定義的setter和getter方法。

4 )針對于非private的val(不可變)屬性,kotlin只生成了getter方法,沒有setter方法,因為定義為val的屬性,是不允許修改的。

5)我們也可以在屬性后面,復(fù)寫getter和setter方法,自己定義要實現(xiàn)的內(nèi)容。

6)針對于private關(guān)鍵字修飾的屬性,kotlin不對外提供setter和getter方法。盡管我們能夠復(fù)寫這兩個方法。外界還是不能夠訪問。這點(diǎn)和Java有很大的不同。

class Person {
    //針對于定義的每個屬性,都有一個filed進(jìn)行封裝。
    //對于非private的屬性,都會生成一對getter和setter方法
    //我們也可以自己定義這倆方法
    var name = ""
        get() = field.plus("_01")
        set(value) {
            field = value.uppercase()
        }
    //對于val的屬性,kotlin不聽過setter方法
    val age = 0
        get() = field + 1
    //對于private屬性,kotlin不提供getter和setter方法。
    //雖然我們已經(jīng)復(fù)寫了,但是外界還是不夠能訪問,這個和java的區(qū)別很大。
    private var subject = ""
        get() = "Kotlin"
        set(value) {
            field = value
        }
}
fun main() {
    val person = Person()
    person.name = "LiLei"
    println(person.name)
    println(person.age)
}

2.構(gòu)造函數(shù)

1)定義在class 類名 后面的構(gòu)造函數(shù),是類的主構(gòu)造函數(shù)。這個和java不一樣,可以直接定義在類上

2)在主構(gòu)造函數(shù)中,可以使用臨時變量給類屬性賦值,為了方便識別,在kotlin中,臨時變量通常會以下劃線開頭_屬性名。如_name:String

3)在主構(gòu)造函數(shù)中,可以同時定義臨時變量和類屬性,要加上var或val修飾符。如var age:Int

4)在屬性參數(shù)后直接設(shè)置默認(rèn)值。創(chuàng)建對象時,默認(rèn)參數(shù)可以不傳。如var subject:String="Kotlin"

5通過constructor() : this可以定義次構(gòu)造函數(shù)

6)通過init{}定義初始化塊,對所傳參數(shù)進(jìn)行有效性檢查。初始化塊會在構(gòu)造類實例時執(zhí)行。

//定義在class 類名 后面的構(gòu)造函數(shù),是類的主構(gòu)造函數(shù)。
//在主構(gòu)造函數(shù)中,可以使用臨時變量給類屬性賦值,為了方便識別,在kotlin中,臨時變量通常會以下劃線開頭_屬性名。
//也可以在主構(gòu)造函數(shù)中,可以同時定義臨時變量和類屬性,要加上var或val修飾符。
//還可以在屬性后直接設(shè)置默認(rèn)值。創(chuàng)建對象時,默認(rèn)參數(shù)可以不傳。
class Person(_name: String, var age: Int, var subject: String = "Kotlin") {
    var name = _name
        get() = field.plus("_01")
        set(value) {
            field = value.lowercase()
        }
    //次構(gòu)造函數(shù)
    constructor(_name: String, _age: Int) : this(_name, _age, "Java"){
        this.name = _name.trim()
    }
    //無參是次構(gòu)造函數(shù)
    constructor() : this("", 1, "")
    //初始化代碼塊
    init {
        //通過require函數(shù),對屬性值做合規(guī)判斷。如果
        require(age > 0) { "age must be >0" }
        require(name.isNotEmpty()){"name can not be empty"}
    }
}
fun main() {
    val person = Person("LiLei ", 18)
    println(person.name)
    println(person.age)
    println(person.subject)
}

3.執(zhí)行順序

對應(yīng)屬性,可以通過主構(gòu)造函數(shù)、類屬性、初始化代碼塊、和次級構(gòu)造函數(shù),來進(jìn)行初始化。

那么他們的執(zhí)行順序就是上面這個順序。這個執(zhí)行順序要牢記,很關(guān)鍵,有可能會踩到坑。

4.延遲初始化

通過 lateinit這個關(guān)鍵字,實現(xiàn)延遲初始化。屬性可以在聲明時,不必賦初始值。但是在使用前必須賦值。可以通過::hobby.isInitialized 這個來判斷是否初始化完成。

    lateinit var hobby:String
    fun initHobby(){
        hobby="game"
    }
    fun isInit():Boolean{
        //判斷屬性是否初始化
        return ::hobby.isInitialized
    }

5.惰性初始化

通過by lazy可以實現(xiàn)惰性初始化。屬性聲明時不必賦值,使用這個屬性時,會自動初始化。

    val lazy by lazy { lazyinit() }
    private fun lazyinit() :Boolean{
        println("lazy init")
        return true
    }

到此這篇關(guān)于Kotlin類與屬性及構(gòu)造函數(shù)的使用詳解的文章就介紹到這了,更多相關(guān)Kotlin類 屬性 構(gòu)造函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論