(新) Kotlin搞起來 —— 2.常識與基礎(chǔ)知識

標(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是一樣的:packageimport,不過在Kotlin里:

源文件可以不需要匹配目錄和包揪漩,源文件可以放在任何文件目錄P铡!奄容!

如果沒有任何包聲明的話冰更,則當(dāng)中的代碼都屬于默認包,導(dǎo)入時包名即為函數(shù)名昂勒!
比如:import shortToast
而如果是在Java中蜀细,假如包名和包路徑不相匹配,編譯器是會報不匹配的錯誤的:

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

還有奠衔,Kotlin中可以使用一種叫擴展方法的東西,你甚至可以連 classinterface 都不寫塘娶,
直接在文件中定義一堆方法归斤,然后全局調(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中使用orand關(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é)論:

默認作用域privateval修飾常量為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等
  • 閉包初始化
    ,結(jié)果輸出:0123456789

訪問數(shù)組:使用[]夺艰,如上~

數(shù)組遍歷

芋哭,除此之外還可以直接調(diào)forEach函數(shù) array.forEach{ print(it) }

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

indices代表下標(biāo)!范圍:(0 <= indices < 數(shù)組size)


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ù)
    ??輸出結(jié)果:else x= 92
    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都是表達式辜梳,
意味著他們可以賦值給某個變量粱甫,這一點在處理邊界問題的時候很有用!比如:

作瞄,輸出結(jié)果:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茶宵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宗挥,更是在濱河造成了極大的恐慌乌庶,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件属韧,死亡現(xiàn)場離奇詭異安拟,居然都是意外死亡,警方通過查閱死者的電腦和手機宵喂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門糠赦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锅棕,你說我怎么就攤上這事拙泽。” “怎么了裸燎?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵顾瞻,是天一觀的道長。 經(jīng)常有香客問我德绿,道長荷荤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任移稳,我火速辦了婚禮蕴纳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘个粱。我一直安慰自己古毛,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布都许。 她就那樣靜靜地躺著稻薇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胶征。 梳的紋絲不亂的頭發(fā)上塞椎,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機與錄音睛低,去河邊找鬼忱屑。 笑死蹬敲,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的莺戒。 我是一名探鬼主播伴嗡,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼从铲!你這毒婦竟也來了瘪校?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤名段,失蹤者是張志新(化名)和其女友劉穎阱扬,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伸辟,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡麻惶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了信夫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窃蹋。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖静稻,靈堂內(nèi)的尸體忽然破棺而出警没,到底是詐尸還是另有隱情,我是刑警寧澤振湾,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布杀迹,位于F島的核電站,受9級特大地震影響押搪,放射性物質(zhì)發(fā)生泄漏树酪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一大州、第九天 我趴在偏房一處隱蔽的房頂上張望续语。 院中可真熱鬧,春花似錦摧茴、人聲如沸绵载。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至焚虱,卻和暖如春购裙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鹃栽。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工躏率, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓薇芝,卻偏偏與公主長得像蓬抄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子夯到,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容