系列文章全部為本人的學習筆記,若有任何不妥之處,隨時歡迎拍磚指正。如果你覺得我的文章對你有用,歡迎關注我,我們一起學習進步!
Kotlin學習筆記(1)- 環境配置
Kotlin學習筆記(2)- 空安全
Kotlin學習筆記(3)- 語法
Kotlin學習筆記(4)- 流程控制
Kotlin學習筆記(5)- 類
Kotlin學習筆記(6)- 屬性
Kotlin學習筆記(7)- 接口
Kotlin學習筆記(8)- 擴展
Kotlin學習筆記(8)- 擴展(續)
Kotlin學習筆記(9)- 數據類
Kotlin學習筆記(10)- 泛型
Kotlin學習筆記(11)- 內部類和嵌套類
Kotlin學習筆記(12)- 委托
Kotlin學習筆記(13)- 函數式編程
Kotlin學習筆記(14)- lambda
一、基礎語法
在語句的結尾不用加
;
聲明一個方法需要加關鍵字
fun
如果函數是重載父類的方法,則需要加
override
關鍵字-
方法中的參數格式為:形參名+冒號+形參類型
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 } }
-
仔細看會發現,翻譯成的java類定義前面有
final
修飾符,因為在kotlin中類默認為final
的,也就是不可繼承的。如果要繼承,需要聲明為open
,或者abstract
。open class Person(name : String, age : int) { init{ // do some thing } }
-
如果
init
中沒有操作,則可以省略class Person(name : String, age : int)
-
如果連參數也沒有,甚至可以這么寫
class Person
三、定義函數方法
-
函數方法要加
fun
關鍵字,方法的返回類型寫在參數后fun sum (a : Int, b : Int) : Int { return a+b }
-
如果像上面這樣,函數內只有一條語句,則可以直接賦值
fun sum (a : Int, b : Int) : Int = a+b
-
kotlin編譯器會自動根據返回值推測方法返回類型
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))
看到網上資料說,如果方法是
public
的,則必須要聲明返回類型。但是我自己試驗發現kotlin的方法默認是public的,同時上面說的幾點都適用,也就是不是必須要明確聲明返回類型。如有錯誤之處,歡迎隨時拍磚指正。
四、定義變量
kotlin中將java中的變量演化成了兩種:var
表示變量,val
便是常量(相當于java中用final
修飾)
var a : Int = 1 // 定義一個普通變量
var b = 2 // 和方法的返回類型一樣,編譯器也會根據值自動判斷變量類型
b = 3 // 普通變量可多次賦值
val c = 1 // 定義一個常量,和普通變量一樣,編譯器也會自動判斷類型
c = 2 // 提示編譯錯誤,無法運行。常量只能賦值一次
val d : Int // 如果常量在定義的時候沒有賦值,則必須明確類型
d = 1 // 賦值
五、使用泛型Array代替數組
例如最經典的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.lxweimin.com/p/6063dee97eca">《Kotlin學習筆記(2)- 空指針》</a>。
八、類型檢測并自動轉換
fun getStringLength (obj : Any) : Int? {
// 通過is關鍵字做類型判斷
if(obj is String){
// 類型判斷后,系統自動轉型,這里自動將obj轉為String類型
return obj.length
}
// 類型判斷之外,obj依然是Any類型,沒有被轉型,所以不能調用length,會報編譯錯誤
var length = obj.length
return null
}
fun getStringLength (obj : Any) : Int? {
// 通過is關鍵字做類型判斷,因為第一個判斷條件已經通過并自動轉型,
// 所以第二個判斷時obj可以直接作為String類型使用
if(obj is String && obj.length > 0){
// 類型判斷后,系統自動轉型,這里自動將obj轉為String類型
return obj.length
}
return null
}
九、循環
-
for
循環,使用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
循環,和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
差不多,都是通過列舉比對列舉出來的條件進行匹配,滿足條件的分支會被執行。when
可以作為表達式,也可以作為聲明。如果用作表達式的話,那么滿足條件的分支就是總表達式。如果用做聲明,不滿足條件的分支的的的值會被忽略,只保留滿足條件的分支,而且返回的值也是最后一個表達式的值。
-
傳統用法
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") }