美文网首页
Kotlin基本语法

Kotlin基本语法

作者: bruce1990 | 来源:发表于2020-04-11 11:16 被阅读0次

    参考教程
    https://www.jianshu.com/p/e42a9ea09ac0
    https://www.runoob.com/kotlin/kotlin-basic-syntax.html
    kotlin官方文档中文版
    作为一名java开发者,先看看java与kotlin的区别

    java与kotlin的区别

    操作对象:在Kotlin中,所有变量的成员方法和属性都是对象,若无返回值则返回Unit对象,大多数情况下Uint可以省略;Kotlin 中没有 new 关键字
    数据类型 & 转换:在Java中通过装箱和拆箱在基本数据类型和包装类型之间相互转换;在Kotlin中,而不管是常量还是变量在声明是都必须具有类型注释或者初始化,如果在声明 & 进行初始化时,会自行推导其数据类型。
    编译的角度:和Java一样,Kotlin同样基于JVM。区别在于:后者是静态类型语言,意味着所有变量和表达式类型在编译时已确定。
    撰写:在Kotlin中,一句代码结束后不用添加分号 “;”;而在Java中,使用分号“;”标志一句代码结束。

    基本语法

    导包

    包的声明应处于源文件顶部:与java一样
    采用import关键字导包 与java一样不同的是它还能导入函数
    比如

    package my.demo
    import  kotlin.text.*
    

    程序入口 main函数

    我使用的是Andorid Studio3.5,使用3.1版编译不会出错,运行的时候会报错

    fun main() {
        println("Hello World!")
    }
    

    函数

    函数定义使用关键字 fun,参数格式为:参数 : 类型

    fun main() {
        println(sum(1, 1))
        println(sum2(2, 2))
        println("Hello World!")
    }
    
    //sampleStart
    fun sum(a: Int, b: Int): Int {// Int 参数,返回值 Int
        return a + b
    }
    
    fun sum2(a: Int, b: Int) = a + b //不得不佩服kotlin的超前思想还能这么玩,自行推导类型
    

    表达式作为函数体,返回类型自动推断:

    fun sum(a: Int, b: Int) = a + b
    public fun sum(a: Int, b: Int): Int = a + b   // public 方法则必须明确写出返回类型  经测试不写好像也没问题...
    

    无返回值的函数(类似Java中的void):

    fun printSum(a: Int, b: Int): Unit { 
        print(a + b)
    }
    // 如果是返回 Unit类型,则可以省略(对于public方法也是这样):
    public fun printSum(a: Int, b: Int) { 
        print(a + b)
    }
    

    默认参数
    函数参数可以有默认值,当省略相应的参数时使用默认值。与其他语言相比,这可以减少重 载数量:
    a. 如果是继承过来的则不能在子类写默认值了

    open class A {
        open fun hi(string: String = "Hi") {
    
        }
    class B : A() {
        override fun hi(string: String) {//不能有默认值
            println(string)
        }
    }
    
    fun main() {
        val b = B()
        b.hi()
    }
    }
    

    b. 如果一个默认参数在一个无默认值的参数之前,那么该默认值只能通过使用命名参数调用该函数来使用:比如

    fun foo(num: Int = 0, s: String) {
        println(num)
        println(s)
    }
    fun main() {
        foo(s = "哈哈")
    }
    

    如果在默认参数之后的最后一个参数是 lambda 表达式,那么它既可以作为命名参数在括号内 传入,也可以在括号外传入:

    fun foo(bar: Int = 0, baz: Int = 1, qux: () -> Unit) {
        println(baz)
    }
    调用的时候
        foo {  }//可以这样
        foo(qux = {})//可以这样
    
    可变长参数函数

    函数的变长参数可以用 vararg 关键字进行标识:比如

    fun vars(vararg v:Int) {
        for (i in v) {
            print(i)
        }
    }
    

    print和println的区别就是println可以换行

    lambda(匿名函数) 还有这种操作 我的天

    lambda表达式使用实例:

        var sumLambda: (Int, Int) -> Int = { x, y -> x + y }
        print(sumLambda(1, 2))
    

    定义常量和变量

    可变变量定义:var 关键字
    var <标识符> : <类型> = <初始化值>
    不可变变量定义:val 关键字,只能赋值一次的变量(类似Java中final修饰的变量)
    val <标识符> : <类型> = <初始化值>

    常量与变量都可以没有初始化值,但是在引用前必须初始化
    编译器支持自动类型判断,即声明时可以不指定类型,由编译器判断。

        val a: Int = 1  // 立即赋值
        val b = 2 //编译器自动推断
        val c: Int      //  如果没有初始值类型不能省略
        c = 3 //明确赋值
        println("a=$a,b=$b,c=$c")
        var d = 5
        d+=1 //改变变量值
        println("d=$d")
        var s="Hello World!"
        println("你好世界$s")
    

    注释 (与java一样不再赘述)

    字符串

    字符串用String类型表示。字符串是不可变的。字符串的元素字符可以使用索引运算 符访问:s[i] 。可以用for循环迭代字符串:

    fun main()  { 
    val str =   "abcd" //sampleStart 
    for (c  in  str)    
    {               println(c) 
    }
     //sampleEnd
     }
    

    与java字符串一样可以使用+操作符连接字符串。但是优先使用字符串模板或原始字符串而不是字符串连接。
    字符串模板
    字符串字面值可以包含模板表达式 ,即一些小段代码,会求值并把结果合并到字符串中。 模 板表达式以美元符( $ )开头,由一个简单的名字构成:

        val i = 10
        println("i = $i")//输出 i = 10
        //或者用花括号括起来的任意表达式:
        val s = "abc"
        println("$s 的长度是${s.length}")//输出 abc 的长度是3
        println("$s 的长度是${b.len(s)}")//输出 abc 的长度是3
    

    NULL检查机制

    Kotlin的空安全设计对于声明可为空的参数,在使用时要进行空判断处理,有两种处理方式,字段后加!!像Java一样抛出空异常,另一种字段后加?可不做处理返回值为 null或配合?:做空判断处理

    类型检测及自动类型转换

    我们可以使用 is 运算符检测一个表达式是否某类型的一个实例(类似于Java中的instanceof关键字)。

    fun getStringLength(obj: Any): Int? {//当返回值可能为空时使用?
        if (obj !is String)
            return null
        // 在这个分支中, `obj` 的类型会被自动转换为 `String`
        return obj.length
    }
    

    区间

    区间表达式由具有操作符形式 .. 的 rangeTo 函数辅以 in 和 !in 形成。
    区间是为任何可比较类型定义的,但对于整型原生类型,它有一个优化的实现。以下是使用区间的一些示例:

        for (i in 1..4) println(i) // 输出“1234”
        for (i in 4..1) println(i) // 什么都不输出
        var x = 5
        if (x in 1..10) { // 等同于 1 <= i && i <= 10
            println(x)
        }
    // 使用 step 指定步长
        for (i in 1..4 step 2) println(i) // 输出“13”  类似于等差数列
    
        for (i in 4 downTo 1 step 2) println(i) // 输出“42”  降序
    // 使用 until 函数排除结束元素
        for (i in 1 until 10) {   // i in [1, 10) 排除了 10
            println(i)
        }
    

    笔记

    1.关于lambda表达式(匿名函数)的理解
    通常完整Lambda表达式会由花括号{}括起来,在花括号内先定义完整语法形式的参数声明(并具有可选的类型注解),然后紧跟着 - >符号,- >符号就是由另一个花括号括起来的方法体部分。如果推测的Lambda的返回类型不是Unit,则Lambda体内的最后一个(或可能单个)表达式被视为返回值。
    Lambda表达式的完整语法形式:

    val sum = { x: Int, y: Int -> x + y }
    

    把所有可选的注解都保留形式

    val sum: (Int, Int) -> Int = { x, y -> x + y }
    

    实例

    fun main() {
        //lambda(匿名函数)的理解
        val sumLambda: (Int, Int) -> Int = { x, y -> x + y }
        println(sumLambda(1, 2))  // 输出 3
        val lam = {a:Int, b:Int->a-b}
        println(lam(3,2))
    }
    

    相关文章

      网友评论

          本文标题:Kotlin基本语法

          本文链接:https://www.haomeiwen.com/subject/gxgzbctx.html