定義常量與變量
類中聲明的屬性,一定要初始化,否則會編譯錯誤。除非你對屬性使用了abstract進行修飾。
var name: String = ""
//abstract var size : Int//必須在抽象類中使用
var boss = "L"
可變變量定義:var 關鍵字
var <標識符> : <類型> = <初始化值>
不可變變量定義:val 關鍵字,只能賦值一次的變量(類似Java中final修飾的變量)
val <標識符> : <類型> = <初始化值>
常量與變量都可以沒有初始化值,但是在引用前必須初始化
編譯器支持自動類型判斷,即聲明時可以不指定類型,由編譯器判斷。
val a: Int = 1
val b = 1 // 系統自動推斷變量類型爲Int
var x = 5 // 系統自動推斷變量類型爲Int
x += 1 // 變量可修改
getter和setter
我們可以按照下面的方式對屬性進行讀寫操作:
var company=Company()
company.name
不同於java,這其實就是對getter和setter方法的隱式調用,是默認的實現,顯示寫出來應該是以下:
var boss = "L"
get() = field
set(value) {
field=value
}
訪問權限
如果我們不想公開某個方法時,可以使用private修飾符實現
var name: String = ""
private set
此時外部就不能修改這個值了,get不能這樣使用,get的訪問權限和屬性是一致的
自定義getter和setter
既然知道了getter和setter的默認實現,那麼我們就可以進行自定義實現
var address: String = ""
get() = if (field.length > 0) "" else "大家好看"
set(value) {
field = if (value.length > 0) "" else value
}
field
在上面我們用到了一個field,在Kotlin中getter和setter不允許使用局部變量的,因爲對屬性的調用也就是對getter的調用,這樣很容易產生遞歸,造成內存溢出。所以Kotlin爲我們提供了field,用這個field代替屬性本身進行操作
lateinit
lateinit關鍵字是用於延遲初始化的,我們在類中聲明的屬性必須初始化。
假如想在類內聲明一個NULL屬性,在需要時再進行初始化,這時就需要用到了