Kotlin學習筆記(3)- 語法

系列文章全部為本人的學習筆記,若有任何不妥之處,隨時歡迎拍磚指正。如果你覺得我的文章對你有用,歡迎關注我,我們一起學習進步!
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

一、基礎語法

  1. 在語句的結尾不用;

  2. 聲明一個方法需要加關鍵字fun

  3. 如果函數是重載父類的方法,則需要加override關鍵字

  4. 方法中的參數格式為:形參名+冒號+形參類型

    fun a (str : String, num : Int)
    

二、定義類

  1. 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
        }
    }
    
  2. 仔細看會發現,翻譯成的java類定義前面有final修飾符,因為在kotlin中類默認為final的,也就是不可繼承的。如果要繼承,需要聲明為open,或者abstract

    open class Person(name : String, age : int) {
     init{  
         // do some thing
     } 
    } 
    
  3. 如果init中沒有操作,則可以省略

    class Person(name : String, age : int)
    
  4. 如果連參數也沒有,甚至可以這么寫

    class Person
    

三、定義函數方法

  1. 函數方法要加fun關鍵字,方法的返回類型寫在參數后

    fun sum (a : Int, b : Int) : Int {
        return a+b
    }
    
  2. 如果像上面這樣,函數內只有一條語句,則可以直接賦值

    fun sum (a : Int, b : Int) : Int = a+b
    
  3. kotlin編譯器會自動根據返回值推測方法返回類型

    fun sum (a : Int, b : Int) = a+b
    
  4. 如果方法不需要返回值,則返回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
}

九、循環

  1. 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")
        }
    }
    
  2. 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可以作為表達式,也可以作為聲明。如果用作表達式的話,那么滿足條件的分支就是總表達式。如果用做聲明,不滿足條件的分支的的的值會被忽略,只保留滿足條件的分支,而且返回的值也是最后一個表達式的值。

  1. 傳統用法

    var x = 3
    when (x) {
        1 -> print(1)
        2 -> print(2)
        else -> print(5)
    }
    
  2. 作為表達式,滿足條件的分支會被作為when的返回值

    var x = 3
    var result = when (x) {
        1 -> 1
        2 -> 2
        else -> 5
    }
    
  3. 分支條件一致,如果有分支可以用同樣的方式處理的話, 分支條件可以連在一起處理。

    when (x) {
        0,1 -> print("x == 0 or x == 1")
        else -> print("otherwise")
    }
    
  4. 使用任意表達式作為分支的條件

    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")
    }
    
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容