by hzwusibo
demo :??GitHub - qq373036876/koltinDemo: koltin 樣例 1守伸、 koltin 基礎(chǔ)知識 2、koltin 類與接口 3糊识、數(shù)據(jù)類 4、泛型 5鸯隅、高階函數(shù)與Lambda表達(dá)式
一巨朦、開發(fā)環(huán)境搭建
A? Kotiln的編譯目標(biāo)是多元的,Java是一元的赶撰,Koltin不僅能編譯成JVM byte code舌镶,還可以編譯成JavaScript,還能作為腳本運(yùn)行(無需編譯)(要轉(zhuǎn)JavaScript 在編譯器豪娜,選Kotion(JavaScript)餐胀,只使用Kotlin原生的API, KotKin(JVM)既可以使用原生API也可以使用JDK API 瘤载,無法轉(zhuǎn)換成JavaScript)
二否灾、基礎(chǔ)知識
B? Kotlin 不支持short 隱形轉(zhuǎn)int ,如果要相互轉(zhuǎn)換? toInt() 講 short轉(zhuǎn)為int (其他幾個類似? tobyte() , toLong()? )
Java:
short? value? = 20鸣奔;
int m = value墨技;
Koltin:
val value:Short = 20 ;? ? ( 寫法有點(diǎn)類似于 uml的類圖表示方法? ? ? val常量,只讀溃蔫,類似final健提、 var變量,讀寫)?
var m =value.toInt();?
C Koltin 數(shù)值可以用? _? 分開寫 比如123456 能寫成 12_3456 伟叛,也能寫出123_4_56
D Kotlin中沒用Java三元操作符私痹, switch語句用when代替(不需要每個后面break), when與if一樣,既可以作為語句也能作為表達(dá)式紊遵,如果是表達(dá)式账千,每個分支最后一個表達(dá)式就是when 或者if表達(dá)式的返回值。(When暗膜,支持多個分支執(zhí)行相同代碼匀奏,支持使用 in (表示在這個范圍內(nèi)),支持分支條件是函數(shù) )
三学搜、類與接口
E? 如果是主構(gòu)造函數(shù)娃善,需要在init塊中初始化。 在init塊中可以直接使用主構(gòu)造器的參數(shù)瑞佩。 如果類中聲明了主構(gòu)造器聚磺,那么第二構(gòu)造器都需要直接或者間接的調(diào)用主構(gòu)造器。
F? Koltin不支持靜態(tài)方法與成員炬丸,由于Koltin支持全局函數(shù)和變量瘫寝,因此可以使用全局函數(shù)和變量來代替(用objects技術(shù))
G Koltin函數(shù)支持默認(rèn)參數(shù) (JVM不支持,是Koltin的表面支持)稠炬, 帶默認(rèn)參數(shù)的必須是最后幾個參數(shù)焕阿,如果某個參數(shù)帶默認(rèn)值,后面的參數(shù)都必須帶默認(rèn)值首启。(支持參數(shù)命名參數(shù)傳遞參數(shù)值 ,? 支持可變參數(shù)? vararg )
H Koltin中? private暮屡、protected、public闽坡、 internal(任何模塊都能訪問栽惶、類似于static )
I? 默認(rèn)的class不能被繼承, 需要顯示的聲明open才能(重寫方法疾嗅,需要在父類方法前加open 關(guān)鍵字外厂,且 要在子類重寫方法前加override關(guān)鍵字, 重寫屬性類似代承,不過需要注意的是 val屬性可以被重寫為var屬性汁蝶,反過來不可以)
J koltin允許接口包含默認(rèn)方法體,對于有方法體的接口方法论悴,并不要求一定要重寫改方法掖棉。(抽象類類似,不過不需要要聲明open)
小結(jié): Koltin類與接口 與java并沒有本質(zhì)區(qū)別膀估,只是為了體現(xiàn)差異幔亥,加了一些語法糖,到底好不好察纯,還需要時間證明
補(bǔ)充:
1 koltin中 set和get 有個小知識點(diǎn) backing field帕棉, Java沒有這樣的概念针肥,剛一看還挺難理解的。
其實(shí)香伴,應(yīng)該使用backing field 慰枕, 否則會死循環(huán)
注意: 在這個位置打印Log也是不能寫city的(看了半天沒找到原因 )
backing field是什么 https://www.jishux.com/p/228468f108ac1bf4
四、枚舉
無
五即纲、數(shù)據(jù)類和封閉類
A. 數(shù)據(jù)類其實(shí)就是 寫很少代碼koltin自動生成余下代碼
使用數(shù)據(jù)類:
B. 編寫數(shù)據(jù)類:主構(gòu)造器至少要一個參數(shù)具帮、 參數(shù)必須標(biāo)記為val 或者 var 、數(shù)據(jù)類不能是抽象類
低斋、open類蜂厅、封閉類 或者 內(nèi)部類。
C. 如果需要復(fù)制一個對象膊畴,然后修改其中一部分屬性葛峻,可以使用copy函數(shù)。
D.數(shù)據(jù)解構(gòu):也就是解除解構(gòu)(將數(shù)據(jù)的屬性提取出來巴比,分別賦予單個變量)
E 封閉類 可以理解為枚舉的拓展,前面用sealed標(biāo)識礁遵,可以有任意多的子類或者對象轻绞,且只能是這些子類與對象
六 泛型
F. Koltin 泛型沒有提供通配符,用out和in關(guān)鍵字佣耐,out聲明泛型的占位符只能在獲取泛型類型值的地方政勃,如函數(shù)的返回,in聲明的泛型占位符只能在設(shè)置泛型類型值的地方兼砖,如函數(shù)參數(shù)奸远。
G. 與java Array相同
與java Array相同
H? ? 星號投射
七、對象和委托
A. Koltin中不是匿名類讽挟,而是對象懒叛, 建立一個對象,需要使用object關(guān)鍵字耽梅,該對象要繼承的類需要與object之間用冒號:分割
B.? 匿名對象只能用在本地或者private聲明中薛窥,如果將匿名對象用于public函數(shù)返回值,或 public屬性的類型眼姐,
那么會返回對象的父類型诅迷,如果沒實(shí)現(xiàn)任何接口或者繼承任何類返回any? ? ?
C. 在Java中,匿名對象訪問封閉作用域內(nèi)放入變量众旗,需要用final聲明改變量罢杉。在Koltin中可以任意訪問與修改
D.Koltin中沒有靜態(tài)成員的概念,用陪伴對象解決贡歧,使用companion關(guān)鍵字聲明
陪伴對象中定義的成員是可以直接通過類名訪問的
(雖然看起來像類的靜態(tài)成員滩租,但在允許期間赋秀,這些成員任然是真實(shí)對象的實(shí)例成員,他與靜態(tài)成員是不同的持际,不過使用@JvmStatic進(jìn)行注解沃琅,Koltin編譯器將會其編譯成byte code真正的靜態(tài)方法)
八、高階函數(shù)與Lambda
A. 高階函數(shù)簡單的說就是 一個函數(shù)作為方法的參數(shù)
B蜘欲、 // Lambda表達(dá)式 Lambda表達(dá)式益眉,或者稱為匿名函數(shù)
? ? // 也就是一 個沒有聲明的函數(shù),但是可以作為表達(dá)式傳遞出去
//? ? max(strings , { a , b - > a.length < b.length }) 等價于 如下代碼
? ? fun compare(a: String, b: String): Boolean = a.length < b.length