類:
聲明類的關(guān)鍵字--class(和Java一樣)
類由三部分組成:
第一部分:類名
第二部分:類頭余指,類頭包含主構(gòu)造函數(shù)和類型參數(shù)捕犬,類頭可選(即可有可無)
第三部分:類體,類體被包含在花括號內(nèi)酵镜,如果沒有類體碉碉,可以省略花括號,類體可選(即可有可無)
如:class BaseAdapter constructor(name : String) {/****/}
(BaseAdapter為類名淮韭,constructor為構(gòu)造函數(shù)關(guān)鍵字垢粮,name為構(gòu)造函數(shù)參數(shù),String為構(gòu)造函數(shù)參數(shù)類型缸濒,花括號內(nèi)部為類體)足丢。如果主構(gòu)造函數(shù)沒有任何注解或者可見性修飾符,可以省略這個 constructor 關(guān)鍵字庇配,即class BaseAdapter(name : String){/****/}
主構(gòu)造函數(shù):
主構(gòu)造函數(shù)不包含任何代碼斩跌,一個類只有一個主構(gòu)造函數(shù)。沒有聲明主構(gòu)造函數(shù)時捞慌,會生成一個默認(rèn)的不帶參數(shù)的主構(gòu)造函數(shù)耀鸦。如果主構(gòu)成函數(shù)的所有參數(shù)都有默認(rèn)值,編譯器會生成一個無參構(gòu)造函數(shù)啸澡,它將使用默認(rèn)值袖订。
沒有聲明主構(gòu)造函數(shù)的類:class Fruit {/****/}
不帶參數(shù)的主構(gòu)造函數(shù)類:class Fruit() {/****/}
帶參數(shù)的主構(gòu)造函數(shù)類:class Fruit(name : String) {/****/}
主構(gòu)造函數(shù)參數(shù)有默認(rèn)值:class Fruit(name : String = "MyName") {/****/}
次構(gòu)造函數(shù):
(1)前綴:無論是否存在主構(gòu)造函數(shù),類中都可以聲明前綴為constructor(非關(guān)鍵字)的次構(gòu)造函數(shù)嗅虏。
(2)委托:次構(gòu)造函數(shù)需要使用this關(guān)鍵字通過自己直接委托或其他構(gòu)造函數(shù)間接委托給主構(gòu)造函數(shù)洛姑,即使該類沒有主構(gòu)造函數(shù),這種委托也會隱式發(fā)生(即不需要跟“this()”)皮服。子類的次構(gòu)造函數(shù)可以間接委托給基類對應(yīng)的次構(gòu)造函數(shù)楞艾,基類的次構(gòu)造函數(shù)直接委托給基類的主構(gòu)造函數(shù)
如:次構(gòu)造函數(shù)constructor(name : String, id : String) : this(name) {/****/}
類成員:
構(gòu)造函數(shù)與初始化塊龄广、屬性硫眯、函數(shù)、嵌套類與內(nèi)部類择同、對象聲明
屬性:
屬性組成部分:var 屬性名 : 屬性類型 = 初始器
val只讀屬性:有g(shù)etter(即get()方法)两入, 沒有setter(即set()方法),如果不想在聲明的時候立即初始化val屬性敲才,可以允許它先為null裹纳,后續(xù)調(diào)用的時候需在屬性后添加!!
或?
進(jìn)行空處理
var可變屬性:有g(shù)etter和setter择葡,如果不想在聲明的時候立即初始化var屬性,可以添加lateinit修飾符標(biāo)記該屬性痊夭,需要的時候再初始化刁岸,可以通過.isInitialized
判斷是否已初始化
private lateinit var mSoundPool : SoundPool
private val mSoundList : SparseIntArray? = null
...
mSoundList?.put(1,1)// ?表示mSoundList不為空時執(zhí)行她我,為空時添加要返回的信息(mSoundList?.put(1,1) ?: null)虹曙,因為put返回的是void,所以這里可以忽略?:null
mSoundList!!.put(2,2)// !!表示不為空時執(zhí)行番舆,為空時會拋異常
mSoundList.put(3,3)// 如果前面的代碼已添加過!!酝碳,后面則不需要再添加
自定義訪問器getter: val name : String get() = "name"
。如果我們定義了一個自定義的 getter恨狈,那么每次訪問該屬性時都會調(diào)用它疏哗。自 Kotlin 1.1 起,如果可以從 getter 推斷出屬性類型禾怠,則可以省略它:val name : get() = "name"
自定義訪問器setter:
var name : String get() = this.toString() // 注意這里要換行
set(value) {/****/}
如果我們定義了一個自定義的 setter返奉,那么每次給屬性賦值時都會調(diào)用它
屬性延遲初始化:屬性前添加“l(fā)ateinit”修飾符,不能是主構(gòu)造函數(shù)中的屬性吗氏,不能是原生類型芽偏,不能自定義getter和setter
幕后字段:
幕后字段通過field標(biāo)識符在屬性的訪問器中引用,field只能用在屬性的訪問器內(nèi)弦讽。
屬性生成幕后字段的條件有兩個污尉,滿足其中一個便會生成幕后字段。
1.(getter和setter兩個訪問器中往产,如果是val屬性則只有g(shù)etter訪問器)至少有一個訪問器是默認(rèn)訪問器(即不是自定義訪問器)被碗,就會為該屬性生成一個幕后字段。
2.在自定義訪問器中通過field標(biāo)識符引用了幕后字段仿村。