系列文章全部為本人的學習筆記描睦,若有任何不妥之處璃赡,隨時歡迎拍磚指正。如果你覺得我的文章對你有用磁携,歡迎關注我褒侧,我們一起學習進步!
Kotlin學習筆記(1)- 環(huán)境配置
Kotlin學習筆記(2)- 空安全
Kotlin學習筆記(3)- 語法
Kotlin學習筆記(4)- 流程控制
Kotlin學習筆記(5)- 類
Kotlin學習筆記(6)- 屬性
Kotlin學習筆記(7)- 接口
Kotlin學習筆記(8)- 擴展
Kotlin學習筆記(8)- 擴展(續(xù))
Kotlin學習筆記(9)- 數(shù)據(jù)類
Kotlin學習筆記(10)- 泛型
Kotlin學習筆記(11)- 內(nèi)部類和嵌套類
Kotlin學習筆記(12)- 委托
Kotlin學習筆記(13)- 函數(shù)式編程
Kotlin學習筆記(14)- lambda
一谊迄、基礎語法
在語句的結尾不用加
;
聲明一個方法需要加關鍵字
fun
如果函數(shù)是重載父類的方法闷供,則需要加
override
關鍵字-
方法中的參數(shù)格式為:形參名+冒號+形參類型
fun a (str : String, num : Int)
二、定義類
-
kotlin默認唯一構造器统诺,暨類定義同時也是構造器
class Person(name : String歪脏, age : int) { init{ // do some thing } } 翻譯成java為: final public class Person { public Person(String name, int age){ init(); } private void init(){ // do some thing } }
-
仔細看會發(fā)現(xiàn),翻譯成的java類定義前面有
final
修飾符粮呢,因為在kotlin中類默認為final
的婿失,也就是不可繼承的。如果要繼承啄寡,需要聲明為open
豪硅,或者abstract
。open class Person(name : String挺物, age : int) { init{ // do some thing } }
-
如果
init
中沒有操作懒浮,則可以省略class Person(name : String, age : int)
-
如果連參數(shù)也沒有识藤,甚至可以這么寫
class Person
三砚著、定義函數(shù)方法
-
函數(shù)方法要加
fun
關鍵字,方法的返回類型寫在參數(shù)后fun sum (a : Int, b : Int) : Int { return a+b }
-
如果像上面這樣痴昧,函數(shù)內(nèi)只有一條語句稽穆,則可以直接賦值
fun sum (a : Int, b : Int) : Int = a+b
-
kotlin編譯器會自動根據(jù)返回值推測方法返回類型
fun sum (a : Int, b : Int) = a+b
-
如果方法不需要返回值,則返回
Unit
赶撰,類似java中的void
舌镶,當然Unit
也是可以忽略的fun printSum (a : Int, b : Int) : Unit = print(sum(a, b)) //等價于 fun printSum (a : Int, b : Int) = print(sum(a, b))
看到網(wǎng)上資料說柱彻,如果方法是
public
的,則必須要聲明返回類型乎折。但是我自己試驗發(fā)現(xiàn)kotlin的方法默認是public的绒疗,同時上面說的幾點都適用,也就是不是必須要明確聲明返回類型骂澄。如有錯誤之處吓蘑,歡迎隨時拍磚指正。
四坟冲、定義變量
kotlin中將java中的變量演化成了兩種:var
表示變量磨镶,val
便是常量(相當于java中用final
修飾)
var a : Int = 1 // 定義一個普通變量
var b = 2 // 和方法的返回類型一樣,編譯器也會根據(jù)值自動判斷變量類型
b = 3 // 普通變量可多次賦值
val c = 1 // 定義一個常量健提,和普通變量一樣琳猫,編譯器也會自動判斷類型
c = 2 // 提示編譯錯誤,無法運行私痹。常量只能賦值一次
val d : Int // 如果常量在定義的時候沒有賦值脐嫂,則必須明確類型
d = 1 // 賦值
五、使用泛型Array代替數(shù)組
例如最經(jīng)典的main
方法
Java:
public static void main(String[] args){
// do some thing
}
Kotlin:
fun main(args : Array<String>){
// do some thing
}
六紊遵、條件語句
fun max(a: Int, b: Int): Int {
if (a > b)
return a
else
return b
}
//或者也可以把if語句作為省略方法體的方法
fun max(a: Int, b: Int) = if (a > b) a else b
七账千、空值
在類型后面跟一個問號?
表示可能為空,跟雙感嘆號!!
表示一定不能為空暗膜。具體的請看我上一篇文章<a herf="http://www.reibang.com/p/6063dee97eca">《Kotlin學習筆記(2)- 空指針》</a>匀奏。
八、類型檢測并自動轉換
fun getStringLength (obj : Any) : Int? {
// 通過is關鍵字做類型判斷
if(obj is String){
// 類型判斷后学搜,系統(tǒng)自動轉型娃善,這里自動將obj轉為String類型
return obj.length
}
// 類型判斷之外,obj依然是Any類型瑞佩,沒有被轉型聚磺,所以不能調用length,會報編譯錯誤
var length = obj.length
return null
}
fun getStringLength (obj : Any) : Int? {
// 通過is關鍵字做類型判斷炬丸,因為第一個判斷條件已經(jīng)通過并自動轉型咧最,
// 所以第二個判斷時obj可以直接作為String類型使用
if(obj is String && obj.length > 0){
// 類型判斷后,系統(tǒng)自動轉型御雕,這里自動將obj轉為String類型
return obj.length
}
return null
}
九、循環(huán)
-
for
循環(huán)滥搭,使用in
關鍵字fun main(args : Array<String>) { for(arg in args) print(arg) for(i in args.indices) print(args[i]) for((index, value) in args.withIndex()){ println("index : $index, value : $value") } }
-
while
循環(huán)酸纲,和java的基本一致fun main(args : Array<String>) { var i = 0 while (i < args.size){ print(args[i++]) } var j = 0 do{ print(args[j]) }while (++j<args.size) }
十、when
表達式(類似于java中的switch
)
when
的特性與switch
差不多瑟匆,都是通過列舉比對列舉出來的條件進行匹配闽坡,滿足條件的分支會被執(zhí)行。when
可以作為表達式,也可以作為聲明疾嗅。如果用作表達式的話外厂,那么滿足條件的分支就是總表達式。如果用做聲明代承,不滿足條件的分支的的的值會被忽略汁蝶,只保留滿足條件的分支,而且返回的值也是最后一個表達式的值论悴。
-
傳統(tǒng)用法
var x = 3 when (x) { 1 -> print(1) 2 -> print(2) else -> print(5) }
-
作為表達式掖棉,滿足條件的分支會被作為
when
的返回值var x = 3 var result = when (x) { 1 -> 1 2 -> 2 else -> 5 }
-
分支條件一致,如果有分支可以用同樣的方式處理的話膀估, 分支條件可以連在一起處理幔亥。
when (x) { 0,1 -> print("x == 0 or x == 1") else -> print("otherwise") }
-
使用任意表達式作為分支的條件
when (x) { parseInt(s) -> print("s encode x") else -> print("s does not encode x") } when (x) { in 1..10 -> print("x is in the range") in validNumbers -> print("x is valid") !in 10..20 -> print("x is outside the range") else -> print("none of the above") }