1、val 只讀不能被修改 var 可以
2、let/also/with/run/apply/repeat 一看就會(huì)

內(nèi)置函數(shù)的總結(jié):
apply使用場(chǎng)景:當(dāng)你需要初始化一個(gè)對(duì)象或配置對(duì)象屬性時(shí)。
also使用場(chǎng)景:當(dāng)你想要執(zhí)行一些副作用操作(比如打印日志),但不改變對(duì)象本身或不關(guān)心返回值時(shí)。。
run使用場(chǎng)景:當(dāng)你想在一個(gè)對(duì)象的上下文中執(zhí)行一系列操作,并返回最后一個(gè)表達(dá)式的值時(shí)。。
let使用場(chǎng)景:當(dāng)你需要在一個(gè)表達(dá)式中使用一個(gè)對(duì)象并希望返回處理后的結(jié)果時(shí)。
with使用場(chǎng)景:當(dāng)你已經(jīng)有一個(gè)對(duì)象實(shí)例,并且想要在這個(gè)對(duì)象上執(zhí)行多個(gè)操作時(shí)。
let和also:
明確一個(gè)變量所處特定的作用域范圍內(nèi)可使用。
針對(duì)一個(gè)可null的對(duì)象統(tǒng)一做判空處理。(重要)
3、學(xué)習(xí)筆記
4、copy函數(shù)只管主構(gòu)造函數(shù),不管次構(gòu)造函數(shù)
5、空值和空類(lèi)型
fun main() {
var str: String? = null
//如果對(duì)象的屬性為null則安全調(diào)用運(yùn)算符返回null
println(str?.length)
//使用非空斷言操作符!!.來(lái)明確不會(huì)出現(xiàn)null問(wèn)題
println(str!!.length)
val str: String? = null
//Elvis運(yùn)算符 ?: 左側(cè)為空值檢測(cè)目標(biāo),右側(cè)為檢測(cè)到null時(shí)返回的結(jié)果
val len: Int = str?.length ?: 0
}
6、takeIf關(guān)鍵字如果是括號(hào){}內(nèi)最后一行執(zhí)行返回的是true,則返回的自身it?
如果是括號(hào){}內(nèi)最后一行執(zhí)行返回的是false,則返回的自身null
takeUnless與takeif作用完全相反
fun CheckMyTakeIf(value :Boolean):Boolean = value
fun main() {
var name: String? = "你好"
var lll = name.takeIf {
CheckMyTakeIf(true)
CheckMyTakeIf(false)
}//最后返回false,所以返回空nu11
println(111)
lll = name.takeIf {
CheckMyTakeIf(false)
CheckMyTakeIf(true)
}//最后返回ture,所以返回自身,自身就是name字符串
println(111)
}
7、伴生對(duì)象companion的由來(lái): 在KT中是沒(méi)有Java的這種static靜態(tài),伴生很大程度上和Java的這種static靜態(tài)差不多,我們的伴生對(duì)象只有一次加載伴生對(duì)象只會(huì)初始化一次。
8、內(nèi)部類(lèi)可以是嵌套類(lèi),Kotlin 的默認(rèn)形式內(nèi)部不能訪問(wèn)外部,要想訪問(wèn),需要額外添加一個(gè) inner 關(guān)鍵字。
9、使用copy函數(shù)的時(shí)候,由于內(nèi)部代碼只處理主構(gòu)造不管次構(gòu)造,所以必須考慮次構(gòu)造的內(nèi)容
data class KtBase92(var name: String, var age: Int) {
var coreInfo: String = ""
init {
println("主構(gòu)造被調(diào)用了")//copy函數(shù)只走這里
}
// 次構(gòu)造
constructor(name: String) : this(name, 99) {
println("次構(gòu)造被調(diào)用")//copy函數(shù)不會(huì)走這里
coreInfo = "增加非常核心的內(nèi)容信息"
}
}
10、數(shù)據(jù)類(lèi)data不能使用 abstract,open,sealed,inner 等等 修飾
11、泛型約束Personclass本身與Personclass的所有子類(lèi) 都可以使用,|其他的類(lèi),都不能兼容此泛型
open class MyAnyclass(name:String)//祖宗類(lèi) 頂級(jí)父類(lèi)
open class Personclass(name:String):MyAnyclass(name = name)//父類(lèi)
class Studentclass(name:String):Personclass(name = name)//子類(lèi)
class Dogclass(name:String)//其他類(lèi)另類(lèi)
//相當(dāng)于Java的T extends PersonClass
// T:PersonClass//Personclass本身與Personclass的所有子類(lèi) 都可以使用,|其他的類(lèi),都不能兼容此泛型
class KtBase106<T : Personclass> (private val inputTypeValue: T, private val isR: Boolean = true) {
// /萬(wàn)能對(duì)象返回器
fun getobj()= inputTypeValue.takeIf{ isR }
}
12、如果泛型類(lèi)型T的參數(shù)是vararg 可變參數(shù),則在接收可變參數(shù)時(shí),可以傳入多個(gè) 指定類(lèi)型的實(shí)例對(duì)象,需要使用Array<out T>類(lèi)型的變量進(jìn)行接收;
實(shí)例對(duì)象以[]運(yùn)算符獲取其items:Array<out T>中的某個(gè)元素,則需要重寫(xiě)該類(lèi)的get方法;
13、當(dāng)我們 對(duì)這個(gè)整個(gè)類(lèi)里面的泛型,只能給讀取 ,不能修改更改,可以聲明 out T 協(xié)變
當(dāng)我們 對(duì)這個(gè)整個(gè)類(lèi)里面的泛型,只能修改,不能讓外界讀取時(shí),可以聲明 in T逆變
out 相當(dāng)于java里面的 <? extend>
in 相當(dāng)于java里面的 <? super>
如果一個(gè)類(lèi)既要參數(shù)泛型又要獲取返回的泛型就不適用in & out