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.jianshu.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")
    }
    
    原文作者:我爱吃栗子啊
    原文地址: https://www.jianshu.com/p/bc208beb3161
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞