var 表明變量 具體使用:java
var a: Int? = null//定義可爲null
var b: Any = Any()//定義類型爲Any(就是Object).不可爲null
var c: String? = null//定義可爲null
lateinit var d: String//定義類型爲String,延遲初始化,不能爲基本類型數據
複製代碼
val 表明常量 定義比較簡單,和java同樣.必須初始化賦值bash
val e:String ="val"
複製代碼
kotlin裏 變量定義默認是有get()和set()的,性能
var <propertyName>: <PropertyType> [= <property_initializer>]
<getter>
<setter>
複製代碼
上面這個看不懂也不要緊. 具體點測試
var data: Any = Any()
get() {
//這裏的field表明data,能夠理解爲臨時變量,用於表明訪問data,
//由於直接return data的話,在kotlin data就表明get()方法,就死循環了..
return field
}
set(value) {
field = value//同理
}
複製代碼
很好理解 var是變量,因此有get和set方法 val是常量,因此只有get方法ui
var data: Any = Any()
fun test() {
//至關於getData()
var a = data
HLog.i("a", a.toString())
HLog.i("data", data.toString())
//至關於setData()
data = Any()
HLog.i("data", data.toString())
}
複製代碼
測試結果: this
####Kotlin 類型系統致力於消滅空引用!不容許聲明變量但不初始化!spa
很重要的一句話.說的也很明白 在這裏我糾結了1個多小時,思想沒轉過來!code
###1.成員變量延遲初始化cdn
private Object data;
public Object getData() {
if (data==null){
data = new Object();
}
return data;
}
public void setData(Object data) {
this.data = data;
}
複製代碼
這種代碼在java裏仍是常常能見到的,延遲初始化.調用的時候纔去建立 或是在沒有set的狀況下就get,防止報空,防止被設置爲null.初始化個默認值,對象
仔細想一想邏輯會發現有問題. data不可能爲null 由於調用後返回的一定不爲null.這裏爲了避免報錯卻聲明返回可能會null. 這就不合理了.
這樣邏輯是對了,可是這樣卻很麻煩.我將類型改成List
直接 data.xxx 的話會提示出錯. 必須調用getData()來操做.這樣就感受有點不和諧了.
由於使用kotlin通常不須要聲明get()和set()方法
固然,哪一種寫法好,看各自的愛好了.若是聲明的不是很耗性能的對象,我認爲 能夠直接初始化
lateinit var data: Any
複製代碼
注意是var,不能延遲初始化val. 雖說是必須定義的時候就初始化,但仍是提供了一個標識,讓var能夠延遲初始化
判null,會提示這是無用的代碼; 並且沒法重寫get set方法,我的以爲這點不太友好.---------------------------------分割線---------------------------------------
您的喜歡與回覆是我最大的動力-_-