標(biāo)簽: Kotlin
本文聲明:
本文由Coder-pig編寫骏令,想了解其他內(nèi)容谤辜,可見【Coder-Pig的豬欄】
尊重作者勞動成果芦缰,未經(jīng)本人授權(quán)企巢,禁止轉(zhuǎn)載!違者必究让蕾!
《Kotlin搞起來》系列目錄地址:http://blog.csdn.net/coder_pig/article/details/72851862
1.常識
- 1.Kotlin文件的后綴是.kt
- 2.Kotlin語句結(jié)尾不用寫分號 ;
- 3.Kotlin中變量名浪规,常量名或听,函數(shù)名不可以使用關(guān)鍵字,如果你還是想用關(guān)鍵字
作為你的XX名笋婿,那么可以為你的XX名加上一對單引號誉裆,比如 'in'; - 4.Kotlin中 實例化對象不需要 寫 new 關(guān)鍵字缸濒,比如:val dog = Dog()找御;
- 5.Kotlin中,用Any類替代了Java中的Object類绍填;
- 6.Kotlin中,用is關(guān)鍵字代替Java中的instanceof栖疑,比如:if(dog is Dog){ ... }
- 7.Kotlin中讨永,沒有extend和implement關(guān)鍵字,使用分號 : 表示遇革,使用逗號間隔卿闹,比如:
2.導(dǎo)包,打包萝快,擴展方法锻霎, 擴展屬性
Kotlin中導(dǎo)包和打包的關(guān)鍵字和Java是一樣的:package和import,不過在Kotlin里:
源文件可以不需要匹配目錄和包揪漩,源文件可以放在任何文件目錄P铡!奄容!
如果沒有任何包聲明的話冰更,則當(dāng)中的代碼都屬于默認包,導(dǎo)入時包名即為函數(shù)名昂勒!
比如:import shortToast
而如果是在Java中蜀细,假如包名和包路徑不相匹配,編譯器是會報不匹配的錯誤的:

另外你還可以在導(dǎo)入類的時候為類設(shè)置一個別名戈盈,比如:


還有奠衔,Kotlin中可以使用一種叫擴展方法的東西,你甚至可以連 class 和 interface 都不寫塘娶,
直接在文件中定義一堆方法归斤,然后全局調(diào)用。而Java中血柳,你需要寫一個和文件名相同的public類官册。
利用這一點我們可以寫一個專門的kt文件,然后寫一堆擴展方法难捌,可以替代Java里經(jīng)常會寫的
類+靜態(tài)方法的工具類膝宁,比如這里判斷網(wǎng)絡(luò)的:

然后需要用到的地方直接調(diào)用即可鸦难。另外有一點要注意:
擴展方法不會去覆蓋已經(jīng)存在的方法!T币合蔽!
比如,你寫了一個名為onCreate()的擴展方法介返,但是Activity卻是不會調(diào)這個
方法的拴事,而是調(diào)用Activity 自帶 的onCreate()方法。
除此之外圣蝎,還有擴展屬性這種東西刃宵,和擴展方法想法一樣,想要在不改動
原有類的基礎(chǔ)上添加屬性徘公。
3.基本數(shù)據(jù)類型牲证,常量,變量关面,延遲加載坦袍,作用域
- 基本數(shù)據(jù)類型
Kotlin中使用接近于Java的方式(內(nèi)置類型)來表示數(shù)字,但是又不完全相同等太,
Kotlin是靜態(tài)類型語言捂齐,意味著所有變量和表達式類型在編譯時已確定。
在Kotlin中所有變量的成員方法和屬性都是對象缩抡。數(shù)字相關(guān)的內(nèi)置類型如下:
(PS:都是繼承Number類)

需要注意幾點:
- 1.沒有自動向上轉(zhuǎn)型奠宜,比如Int轉(zhuǎn)Long,需要自己調(diào)toXxx方法轉(zhuǎn)瞻想,比如:
val a: Int = 1024 ????????val b:Long = a.toLong()
- 2.Long類型結(jié)尾必須為大寫的L挎塌,不能為小寫,比如1024L
- 3.Kotlin中的字符Char不是基本數(shù)據(jù)類型(不繼承Number)内边,用單引號來聲明榴都,
比如'c',不能像Java一樣直接拿來當(dāng)數(shù)字使漠其,如果你想把Char的值給Int嘴高,需要調(diào)toInt()方法 - 4.Boolean的值為true或false
- 5.Kotlin不支持8進制,十六進制0x開頭和屎,二進制0b開頭
- 6.位運算符拴驮,Java中的與或運算符用:|和&,kotlin中使用or和and關(guān)鍵字來替代
其他運算符也有分別的關(guān)鍵字替代:shl(有符號左移)柴信,shr(有符號右移)套啤,ushr(無符號右移)
,xor(按位異或)随常,inv(按位取反) - 7.(1.1版本新增)支持下劃線使數(shù)字常量更易讀潜沦,比如:val oneMillion = 1_000_000
- 常量與變量
Kotlin中使用 val 關(guān)鍵字來聲明一個只讀常量(final萄涯,定義后,如果去修改變值是會報錯)唆鸡,
而使用 var 關(guān)鍵字來聲明一個變量涝影!
普通的寫法示例(顯式指定)

和Java里那種int b = 123;很類似,而Kotlin里有類型推斷(Type inference)這種東西争占,
你甚至可以不指定數(shù)據(jù)類型燃逻,讓它自動從后面的語句中推斷出來對應(yīng)的類型!比如你可以寫成:

然后問題來了臂痕,初始化的問題伯襟,比如Android中我們初始化控件會先寫一個變量然后初始化為null,
而在Kotlin如果你直接這樣寫是會報錯的:

不能為空值握童?是的逗旁,這涉及到Kotlin中引以為傲的NULL安全,后面會細說舆瘪,這里告訴你加個
問號就可以了:

為什么你學(xué)到后面就知道了,當(dāng)然這里肯定還有另外一種解決的套路红伦。對了英古,有人喜歡把這種
先定義,用到的時候再去初始化的套路叫做:延時加載昙读,而kotlin中對此也提供了一個操
作符:lateinit召调,用法也很簡單:

- 作用域
Kotlin中和Java是有些許不同的:
- public:默認,總是可見
- internal:同模塊可見蛮浑,起保護作用唠叛,防止模塊外被調(diào)用
- private:僅在同一個文件中可見
- protected:類似于private,但對子類也可見
既然說到作用域沮稚,相信你會對常量和變量的作用域感興趣艺沼,我們把kotlin文件轉(zhuǎn)成Java文件
就一清二楚了:

從圖中不難得出這樣的結(jié)論:
默認作用域private,val修飾常量為final會生成get方法蕴掏,而var修飾變量則會自動生成get和set方法障般。
4.方法定義,Unit修飾符盛杰,可變參數(shù)
kotlin中使用 fun 關(guān)鍵字來聲明一個方法挽荡,先要說一個返回值:Unit,
和Java中的void類似即供,表示的是:返回一個沒有意義的值定拟,默認,可以不寫逗嫡!
在方法名后面加一個()青自,如果需要傳入?yún)?shù)可以寫在這里株依!示例如下:

另外,還有個名詞要關(guān)注下性穿,那就是可變參數(shù)勺三,如果你用過AsyncTask的話,相信
你應(yīng)該不會陌生:

就是適用于參數(shù)類型確定需曾,而個數(shù)不確定的場景吗坚,Java會將可變參數(shù)作為數(shù)組處理!
而在Kotlin中呆万,使用 vararg 關(guān)鍵字修飾商源,只能一個個傳值, 不能直接使用外部Array谋减,除非
使用 * 符號表示將Array中所有的元素都當(dāng)做參數(shù)處理牡彻! 示例如下:


另外,除了上面介紹的擴展方法出爹,還有一種特殊的方法:本地方法庄吼,就是定義在方法內(nèi)部的方法,
可以訪問外部方法中的私有成員严就!最后总寻,如果沒有訪問控制符修飾的方法,默認是public final的梢为,比如:

5.字符串
Kotlin中支持字符串模板渐行,就是支持用符號來取值,使用美元符號$來取得變量的值
看下這個示例你就知道字符串模板有多好用了:

另外Kotlin還支持字符串遍歷铸董,比如:

6.數(shù)組
Kotlin中使用 Array 類表示數(shù)組祟印,需注意一點:[]訪問數(shù)組元素在這里實際上是進行了操作符的
重載,調(diào)用的其實是Array類的getter和setter方法粟害,但是編譯成字節(jié)碼的時候會進行優(yōu)化蕴忆,
變成直接訪問數(shù)組的內(nèi)存地址,所以并不會造成性能損失悲幅!
創(chuàng)建數(shù)組:
- 定長數(shù)組:val fixedSizeArray = arrayOfNulls(10)
- 空數(shù)組: val empty = emptyArray()
- 裝箱操作:val arr = arrayOf(1, 2, 3) //還有其他比如IntArrayOf孽文,BooleanArrayOf等
-
閉包初始化:
訪問數(shù)組:使用[]夺艰,如上~
數(shù)組遍歷:

根據(jù)下標(biāo)遍歷:

7.流程控制
判斷結(jié)構(gòu)
kotlin中if-else的使用與Java基本類似郁副,只是Java中的條件表達式在Kotlin中有
更優(yōu)雅的寫法而已减牺,比如,Java里你會這樣寫:

而在Kotlin中你可以這樣寫:

你還可以直接把表達式寫得很騷,比如:返回不同類型:

另外拔疚,表達式必須有值肥隆,如果else不返回東西的話,你需要引入Unit類:

另外還有一點稚失,在if語句塊的最后可以自動返回最后一行表達式的值栋艳,而不需要寫return

循環(huán)結(jié)構(gòu)
Kotlin中的while與do-while,break句各,continue與Java中的類似吸占,不過Kotlin中多了個好玩的東西:
Ranages,包含與范圍有關(guān)的函數(shù)操作符凿宾,對應(yīng)的范圍關(guān)鍵字是 in 矾屯,使用示例如下:
- 1.判斷某個值是否在一個范圍內(nèi)
?
![]()
?
- 2.判斷某個字符串是否包含某兩個字符串中的一個或多個:
?
![]()
?
- 3.循環(huán)遍歷的玩法:
前面數(shù)組遍歷我們這樣寫:
?
??,輸出:12345678910![]()
?
你也可以調(diào)lastIndex來獲得最后的下標(biāo)初厚,寫成if(i in 0..array.lastIndex)
如果你不想順著遍歷件蚕,想反過來遍歷,可以利用 downTo (遞減)關(guān)鍵字产禾,從最大值到最小值遞減排作!
?
?? 輸出:109876543![]()
?
可能你還想隔著遍歷,比如只遍歷:10,7,4,1亚情,可以用 step (步長)關(guān)鍵字妄痪!后面跟著的是步長,
比如你可以寫成小數(shù)0.1這樣也行势似,示例:
?
?? 輸出:10963![]()
?
除此之外,其實還有一個倒序的方法:reversed()僧著,比如下述代碼:
?

?? 輸出:10987654321
增強版Switch(when語句)
Kotlin中使用when語句來替代Java中的switch語句履因,相比起switch強大太多,
可以匹配類型盹愚,值和范圍還有參數(shù)栅迄,而且不用寫break語句,使用示例如下:
- 1.匹配值與范圍:
?
![]()
??輸出結(jié)果:A
?
- 2.匹配類型(只能匹配變量的類型皆怕,或else):
?
![]()
??輸出結(jié)果:是整型
?
- 3.匹配參數(shù)
PS:這里就是把函數(shù)結(jié)果作為判斷參數(shù)而已毅舆,比如這里變成-92,result是92不匹配就走else~
8.異常
Kotlin中所有的Exception都繼承了Throwable愈腾,含有一個message且未經(jīng)檢查憋活。
這表示不會強迫我們在任何地方使用try/catch,而Java中如果某個方法拋出
了Exception虱黄,就需要用try-catch包圍代碼塊悦即!換一種說法:
"Kotlin中沒有檢驗異常!"
而拋出異常和try-catch-finally和Java中的類似!但是Kotlin中throw和try都是表達式辜梳,
意味著他們可以賦值給某個變量粱甫,這一點在處理邊界問題的時候很有用!比如:

