引言
最近項(xiàng)目中開始使用Kotlin 語(yǔ)言尔苦,想掌握的更好只好看kotlin 官網(wǎng)文檔慎皱。今天主要看類與對(duì)象模塊。
類及一些使用語(yǔ)法
一框都、同java 一樣,通過class 關(guān)鍵字來聲明
二呵晨、創(chuàng)建對(duì)象:是沒有new 關(guān)鍵字魏保,直接用--> class(),class 是我定義的類。
三何荚、構(gòu)造函數(shù)囱淋,一個(gè)類有一個(gè)主構(gòu)造函數(shù)和可以有多個(gè)次級(jí)構(gòu)造函數(shù)猪杭,主構(gòu)造函數(shù)是類頭的一部分餐塘,放在類名之后。如果類沒有注解或者可見修飾符皂吮,那么constructor可以省略戒傻。
四、注意:主構(gòu)造函數(shù)中的屬性蜂筹,可以在初始化塊中使用和類體內(nèi)聲明的屬性的初始化器中使用需纳。
五、在次級(jí)構(gòu)造函數(shù)中艺挪,如果要委托到一個(gè)類中的另一個(gè)構(gòu)造函數(shù)不翩,用 this關(guān)鍵字,(我在自定義dialog 時(shí)候用到過麻裳,自定義控件中應(yīng)該能經(jīng)常用到)
六口蝠、注意點(diǎn):初始化塊中代碼和初始化器中的代碼是在次級(jí)構(gòu)造函數(shù)之前調(diào)用的。
七津坑、kotlin 中所有類有一個(gè)超類妙蔗,Any,類似于java 中的Object類
八疆瑰、kotlin 類一般都是final眉反,如果要使用其可以被繼承昙啄,用關(guān)鍵字 open 來修飾。
九寸五、密封類:在類名程前添加 修飾符sealed梳凛,其子類和其必須在一個(gè)文件中。
范型特點(diǎn)總結(jié):
范型:參數(shù)化類型梳杏,故名思意伶跷,就是對(duì)參數(shù)類型進(jìn)行一個(gè)靈活定義,減少重復(fù)代碼量秘狞,解除與實(shí)際類型的定向綁定叭莫,達(dá)到解耦,在編譯階段就就會(huì)提示烁试,在代碼中類型進(jìn)行強(qiáng)轉(zhuǎn)雇初,如果類型轉(zhuǎn)換是錯(cuò)誤的,編譯時(shí)不會(huì)提示减响,在運(yùn)行的時(shí)候才會(huì)提示靖诗,用范型在編譯階段就會(huì)提示,增加了代碼的安全性支示,并且代碼清晰刊橘,容易閱讀。
注意點(diǎn):一個(gè)方法是不是范型和其所在的類是不是范型沒有關(guān)系颂鸿。
類型參數(shù)限定: 分為上界 和下界促绵,上界用extends關(guān)鍵字來來實(shí)現(xiàn),下界是用 super 關(guān)鍵字來實(shí)現(xiàn)嘴纺。
lateinit 和 lazy 延遲初始化區(qū)別
一败晴、lateinit 只用于變量var ,lazy 只用于常量val 栽渴,
二尖坤、lazy 應(yīng)用于單單例模式,而且當(dāng)且僅當(dāng)變量第一次調(diào)用的時(shí)候 委托才會(huì)被調(diào)用闲擦。第一調(diào)用的時(shí)候是執(zhí)行表達(dá)式并記錄結(jié)果慢味,第二次調(diào)用直接讀取結(jié)果。
lateinit 只能用于聲明周期內(nèi)參數(shù)獲取或初始化墅冷。
kotlin const val 和 val 區(qū)別:
const 必須修飾val
const 只允許在top-level級(jí)別和object中聲明纯路,使用方式如下
打開Android studio 點(diǎn)擊 Tools->Kotlin->Show Kotlin ByteCode,通過查看字節(jié) 碼,可以看到生成的代碼的區(qū)別如下:
// class version 50.0 (50)
// access flags 0x31
public final class com/example/kotlin/myObject {
// access flags 0x19
public final static Ljava/lang/String; constObject = "constObject"
@Lorg/jetbrains/annotations/NotNull;() // invisible
// access flags 0x1A
private final static Ljava/lang/String; normalObject = "normalObject"
@Lorg/jetbrains/annotations/NotNull;() // invisible
// access flags 0x11
public final getNormalObject()Ljava/lang/String;
@Lorg/jetbrains/annotations/NotNull;() // invisible
L0
LINENUMBER 144 L0
GETSTATIC com/example/kotlin/myObject.normalObject : Ljava/lang/String;
ARETURN
L1
LOCALVARIABLE this Lcom/example/kotlin/myObject; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
......
總結(jié):從字節(jié)碼我們可以看到const val 和val修飾對(duì)象的主要區(qū)別是:
const val 可見性為public final static俺榆,可以直接訪問感昼。
val 可見性為private final static,并且val 會(huì)生成方法getNormalObject()罐脊,通過方法調(diào)用訪問定嗓。
如果定義常量時(shí)候蜕琴,用const val 方式效率更高。避免方法的頻繁調(diào)用宵溅。