前言:
Kotlin里面沒有new !!! Kotlin里面沒有new !!! Kotlin里面沒有new !!!
不用寫 ; 號結(jié)尾
一.var與val
var 代表變量
具體使用:
var a: Int? = null//定義可為null
var b: Any = Any()//定義類型為Any(就是Object).不可為null
var c: String? = null//定義可為null
lateinit var d: String//定義類型為String,延遲初始化,不能為基本類型數(shù)據(jù)
val 代表常量
定義比較簡單,和java一樣.必須初始化賦值
val e:String ="val"
二get() 和set()
kotlin里 變量定義默認(rèn)是有g(shù)et()和set()的,
var <propertyName>: <PropertyType> [= <property_initializer>]
<getter>
<setter>
上面這個看不懂也沒關(guān)系.
具體點(diǎn)
var data: Any = Any()
get() {
//這里的field代表data,可以理解為臨時變量,用于代表訪問data,
//因?yàn)橹苯觬eturn data的話,在kotlin data就代表get()方法,就死循環(huán)了..
return field
}
set(value) {
field = value//同理
}
var和val的get set會有區(qū)別
很好理解
var是變量,所以有g(shù)et和set方法
val是常量,所以只有g(shù)et方法
具體使用
var data: Any = Any()
fun test() {
//相當(dāng)于getData()
var a = data
HLog.i("a", a.toString())
HLog.i("data", data.toString())
//相當(dāng)于setData()
data = Any()
HLog.i("data", data.toString())
}
測試結(jié)果:
三.變量的空引用檢查
Kotlin 類型系統(tǒng)致力于消滅空引用!不允許聲明變量但不初始化!
很重要的一句話.說的也很明白
在這里我糾結(jié)了1個多小時,思想沒轉(zhuǎn)過來!
舉個例子:
1.成員變量延遲初始化
private Object data;
public Object getData() {
if (data==null){
data = new Object();
}
return data;
}
public void setData(Object data) {
this.data = data;
}
這種代碼在java里還是經(jīng)常能見到的,延遲初始化.調(diào)用的時候才去創(chuàng)建
或是在沒有set的情況下就get,防止報空,防止被設(shè)置為null.初始化個默認(rèn)值,
自動轉(zhuǎn)化成kotlin代碼是這樣的:
報錯了!為什么會報錯?
那么聲明一下,在返回類型后面加個?,允許return null
仔細(xì)想想邏輯會發(fā)現(xiàn)有問題. data不可能為null
因?yàn)檎{(diào)用后返回的必定不為null.這里為了不報錯卻聲明返回可能會null.
這就不合理了.
換種寫法
這樣邏輯是對了,但是這樣卻很麻煩.我將類型改為List
直接 data.xxx 的話會提示出錯.
必須調(diào)用getData()來操作.這樣就感覺有點(diǎn)不和諧了.
我覺得這樣寫就好了
因?yàn)槭褂胟otlin一般不需要聲明get()和set()方法
當(dāng)然,哪種寫法好,看各自的愛好了.如果聲明的不是很耗性能的對象,我認(rèn)為
可以直接初始化
四.lateinit 延遲初始化var
lateinit var data: Any
注意是var,不能延遲初始化val.
雖然說是必須定義的時候就初始化,但還是提供了一個標(biāo)識,讓var可以延遲初始化
判null,會提示這是無用的代碼;
而且無法重寫get set方法,個人覺得這點(diǎn)不太友好.
---------------------------------分割線---------------------------------------
您的喜歡與回復(fù)是我最大的動力-_-