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="//www.greatytc.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")
    }
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,565评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,021评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,003评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,015评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,020评论 5 370
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,856评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,178评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,824评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,264评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,788评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,913评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,535评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,130评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,102评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,334评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,298评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,622评论 2 343

推荐阅读更多精彩内容