Kotlin搞起來——2.基礎知識
在上一節中簡單的給大家介紹了下Kotlin的特點,以及結合自己實際專案
中的使用來幫助大家瞭解這門語言,其實真的沒你想象中的那麼難,本文打算
介紹的是Kotlin中基礎相關的一些語法(用法),有個大概印象即可,你寫kotlin
時遇到不會的點,回來這裡檢視即可!對了,差點忘了關於kotlin中很重要的一點:
本節關鍵字一覽:
- var:定義變數
- val:定義常量
- fun:定義方法
- Unit:預設方法返回值,類似於Java中的void,可以理解成返回沒什麼用的值
- vararg:可變引數
- $:字串模板(取值)
- 位運算子:or(按位或),and(按位與),shl(有符號左移),shr(有符號右移),
ushr(無符號右移),xor(按位異或),inv(按位取反) - in:在某個範圍中
- downTo:遞減,迴圈時可用,每次減1
- step:步長,迴圈時可用,設定每次迴圈的增加或減少的量
- when:Kotlin中增強版的switch,可以匹配值,範圍,型別與引數
- is:判斷型別用,類似於Java中的instanceof()
1.package打包與import導包
Kotlin中的package和import與Java中的使用是一樣的,不過kotlin中:
“ 原始檔可以不需要匹配目錄和包,原始檔可以放在任何檔案目錄!”
如果沒有任何包宣告的話,則當中的程式碼都屬於預設包,匯入時包名即為函式名!
比如:import shortToast
而如果是在Java中,假如包名和包路徑不相匹配,編譯器是會報不匹配的錯誤的:
另外你還可以在匯入類的時候為類設定一個別名,比如:
還有,kotlin中因為可以使用擴充套件方法
直接在檔案中寫一堆fun方法!
而關於作用域,Kotlin中和Java是有些許不同的:
- public:預設,總是可見
- internal:同模組可見
- private:聲明範圍與同模組的子作用域可見
- protected:類似於private,但對子類也可見
注意:Java中不同包名沒有任何直接關係!
2.常量與變數(val與var)
kotlin中使用val關鍵字來宣告一個只讀常量(final,不可修改,定義後,如果
後面修改值的話會報錯的!),而使用var關鍵字來宣告一個變數!
普通的寫法:
你還可以連資料型別都不謝,因為Kotlin有:型別推斷(Type inference) 的特性:
可以不指定資料型別,它會自動從後面的語句中推斷出來!比如:
還有一點,val定義常量和var定義變數,預設都是private的,比如
定義:val a =123, var b = 321,開啟生成的.class檔案可以看到:
如圖,private私有,且預設寫了公有的getter和setter方法。
3.方法定義
kotlin中使用 fun 關鍵字來宣告一個方法,先要說一個返回值:Unit,
和Java中的void類似,表示的是:返回一個沒有意義的值,預設,可以不寫!
在方法名後面加一個(),如果需要傳入引數可以寫在這裡!示例如下,
另外,如果是可變引數的話,可以使用 vararg 關鍵字修飾,只能一個個傳值,
不能直接使用外部Array,除非使用 ***** 符號表示將Array中所有的元素都當做
引數處理!示例如下:
另外,Kotlin中的方法可以直接定義在檔案中,而不需要依賴於任何的類,這個
稱為擴充套件方法;而寫在class或object中的方法則稱成員方法;Kotlin中還有一種
特殊的方法:本地方法,定義在方法內部的方法,可以訪問外部函式的私有成員!
對了,如果沒有訪問控制符修飾的fun預設是public final的!比如:
4.字串
首先是字串模板,就是支援用符號來取值,比如上面的pro方法中,
然後kotlin還支援字串遍歷
5.資料型別
Kotlin中使用接近於Java的方式(內建型別)來表示數字,但是又不完全相同,
比如沒有隱式轉換!Kotlin中數字相關的內建型別如下:
需要注意幾點:
- 1.沒有自動向上轉型,比如Int轉Long,需要自己調toXxx方法轉
- 2.Long型別結尾必須為大寫的L,不能為小寫,比如1024L
- 3.字元Char不是Number,用單引號來宣告,比如'c',不能像Java一樣直接拿來當數字使,
如果你想把Char的值給Int,需要調toInt()方法 - 4.Boolean的值為true或false
- 5.Kotlin不支援8進位制,十六進位制0x開頭,二進位制0b開頭
- 6.位運算子,Java中的與或運算子用:|和&,kotlin中使用or和and關鍵字來替代
其他運算子也有分別的關鍵字替代:shl(有符號左移),shr(有符號右移),ushr(無符號右移)
,xor(按位異或),inv(按位取反)
6.陣列
Kotlin中使用 Array 類表示陣列,需注意一點:[]訪問陣列元素在這裡實際上是進行了操作符的
過載,呼叫的其實是Array類的getter和setter方法,但是編譯成位元組碼的時候會進行優化,
變成直接訪問陣列的記憶體地址,所以並不會造成效能損失!
建立陣列:
- 定長陣列:val fixedSizeArray = arrayOfNulls<Int>(10)
- 空陣列: val empty = emptyArray<Int>()
- 裝箱操作:val arr = arrayOf(1, 2, 3) //還有其他比如IntArrayOf,BooleanArrayOf等
- 閉包初始化: ,結果輸出:0123456789
訪問陣列:使用[],如上~
遍歷陣列:
根據下標遍歷:
indices代表下標!範圍:( 0 <= indices < 陣列size)
7.流程控制
判斷結構(條件表示式):
kotlin中if-else的使用與Java基本類似,而Java中有條件表示式這種東西:
而Kotlin面向表示式,寫法如下:
你還可以直接把表示式寫得很騷,比如:返回不同型別:
另外,表示式必須有值,如果else不返回東西的話,你需要引入Unit類:
還有一點,在if語句塊的最後可以自動返回最後一行表示式的值,而不需要寫return
迴圈結構:
Kotlin中的while與do-while,break,continue與Java中的類似,不過Kotlin中多了個好玩的東西:
Ranages,包含與範圍有關的函式操作符,使用示例如下:
- 1.在範圍內與不在範圍內:
- 2.判斷某個字串是否包含某兩個字串中的一個或多個:
- 3.迴圈遍歷的玩法:
前面陣列遍歷我們這樣寫:
,輸出:12345678910
你也可以調lastIndex來獲得最後的下標,寫成if(i in 0..array.lastIndex)
如果你不想順著遍歷,想反過來遍歷,可以利用downTo (遞減)關鍵字,從最大值到最小值遞減!
輸出:109876543
可能你還想隔著遍歷,比如只遍歷:10,7,4,1,可以用 step (步長)關鍵字!後面跟著的是步長,
比如你可以寫成小數0.1這樣也行,示例:
輸出:10963
除此之外,其實還有一個倒序的方法:reversed(),比如下述程式碼:
輸出:10987654321
增強版Switch(when語句)
when語句可以匹配型別,值和範圍還有引數,而且不用寫break語句,非常可怕!
使用示例如下:
匹配值與範圍:
輸出結果:A
匹配型別(只能匹配變數的型別,或else):
輸出結果:是整型
匹配引數
:輸出結果:else x= 92
8.異常
Kotlin中所有的Exception都繼承了Throwable,含有一個message且未經檢查。
這表示不會強迫我們在任何地方使用try/catch,而Java中如果某個方法丟擲
了Exception,就需要用try-catch包圍程式碼塊!換一種說法:
“Kotlin中沒有檢驗異常!”
而丟擲異常和try-catch-finally和Java中的類似!但是Kotlin中throw和try都是表示式,
意味著他們可以賦值給某個變數,這一點在處理邊界問題的時候很有用!
比如:
,輸出結果:
9.本節小結
本節對Kotlin中的一些基礎知識進行了解讀,包括導包打包,常量變數,方法定義,
字串,陣列,流程控制與異常這個八個常見的知識點,相信你對kotlin的掌握
又更進一步了,本來想把集合也放這一節的,考慮到集合的操作符比較多,
遂放到下一節,敬請期待~
本節參考文獻如下:
Kotlin官方文件
kotlin-for-android-developers-zh
Step into Kotlin
修改日誌:
- 2016.11.11 感謝Berial 指出的錯誤:
- 1.預設的作用域修飾符是public而非internal!
- 2.Kotlin中表示數字的是內建型別,而非包裝類!
作者:coder_pig
連結:https://www.jianshu.com/p/29c8b5775663
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。