Kotlin-屬性和賦值

要想使用kotlin的各個屬性,先得聲明Kotlin類

變量

Kotlin中類的屬性可以用var或者val關鍵字進行聲明,其中var爲可變屬性,val爲只讀屬性(相當於Java的final)。

class Student {
    var name = "名字" //名字屬性可變,用var
    val birthday = "1994-10-26" //生日屬性不可變,用val
}

像上面這樣就簡單的爲Student類聲明瞭name和birthday兩個屬性,且在聲明屬性時進行了初始化,按照Kotlin的類型推斷特點,name和birthday就是屬於String類型。現在我想爲Student類添加一個age屬性,但是我並不想在聲明時進行初始化,用Java寫起來非常簡單即可實現

public class JavaStudent {
    private String name = "名字";
    private String birthday = "1994-10-26";
    private int age;//Java版的實現
}

按照Java的實現套路直接套入Kotlin你會發現IDE直接報錯並提示property must be initialized or be abstract

按照提示我們必須把類和字段都聲明爲abstract纔可以通過編譯。
abstract class Student {
    var name = "名字" //名字屬性可變,用var
    val birthday = "1994-10-26" //生日屬性不可變,用val
    abstract var age: Int
}

這樣未免太過麻煩,而且理解起來也非常奇怪。Kotlin提供了延遲初始化的方式來解決初始化的問題,使用關鍵字lateinit即可,這樣就無需聲明abstract了。

可惜使用lateinit延遲初始化age之後,IDE依舊報錯,這次提示的內容是lateinit modifier is not allowed on primitive type properties。Kotlin並不支持對原生類型進行lateinit,爲什麼呢?因爲Kotlin會使用null來對每一個用lateinit修飾的屬性做初始化,而基礎類型是沒有null類型,所以無法使用lateinit。這點很好理解,就像可以把int型變量賦值爲0,卻無法賦值爲null一樣。所以這裏爲了通過IDE的編譯,我們可以採用兩種方案,要麼還是直接在age聲明時進行初始化,要麼不用基礎類型來定義age。

class Student {
    var name = "名字" //名字屬性可變,用var
    val birthday = "1994-10-26" //生日屬性不可變,用val
    var age = 0 //直接使用0初始化age,age爲Int型
    lateinit var ageStr: String //String不是基礎類型,可以使用lateinit初始化
}

 

發佈了19 篇原創文章 · 獲贊 11 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章