日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Kotlin類與屬性及構造函數的使用詳解_Android

作者:niuyongzhi ? 更新時間: 2022-10-31 編程語言

1.類的屬性 filed

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

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

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

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

5)我們也可以在屬性后面,復寫getter和setter方法,自己定義要實現的內容。

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

class Person {
    //針對于定義的每個屬性,都有一個filed進行封裝。
    //對于非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方法。
    //雖然我們已經復寫了,但是外界還是不夠能訪問,這個和java的區別很大。
    private var subject = ""
        get() = "Kotlin"
        set(value) {
            field = value
        }
}
fun main() {
    val person = Person()
    person.name = "LiLei"
    println(person.name)
    println(person.age)
}

2.構造函數

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

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

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

4)在屬性參數后直接設置默認值。創建對象時,默認參數可以不傳。如var subject:String="Kotlin"

5通過constructor() : this可以定義次構造函數

6)通過init{}定義初始化塊,對所傳參數進行有效性檢查。初始化塊會在構造類實例時執行。

//定義在class 類名 后面的構造函數,是類的主構造函數。
//在主構造函數中,可以使用臨時變量給類屬性賦值,為了方便識別,在kotlin中,臨時變量通常會以下劃線開頭_屬性名。
//也可以在主構造函數中,可以同時定義臨時變量和類屬性,要加上var或val修飾符。
//還可以在屬性后直接設置默認值。創建對象時,默認參數可以不傳。
class Person(_name: String, var age: Int, var subject: String = "Kotlin") {
    var name = _name
        get() = field.plus("_01")
        set(value) {
            field = value.lowercase()
        }
    //次構造函數
    constructor(_name: String, _age: Int) : this(_name, _age, "Java"){
        this.name = _name.trim()
    }
    //無參是次構造函數
    constructor() : this("", 1, "")
    //初始化代碼塊
    init {
        //通過require函數,對屬性值做合規判斷。如果
        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.執行順序

對應屬性,可以通過主構造函數、類屬性、初始化代碼塊、和次級構造函數,來進行初始化。

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

4.延遲初始化

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

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

5.惰性初始化

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

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

原文鏈接:https://blog.csdn.net/niuyongzhi/article/details/126575708

欄目分類
最近更新