要想使用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初始化
}