我的Kotlin成长之路

来源:互联网 发布:mysql数据库安装路径 编辑:程序博客网 时间:2024/05/19 19:15

【我的Kotlin成长之路】基础知识及语法(一)

大部分知识来自简书作者:小耳朵图图是我


  • 定义

    • var 声明变量
    • val 声明常量
    • 声明变量或常量时,标识符在前,类型在后,中间用英文冒号隔开,示例如下(需要注意的是,常量延迟加载by lazy{},变量延迟lateinit。):

      //可以快速赋值{int x = 123; }var x = 123//可以标准赋值{String s = "hello"; }var s:String = "hello"//可以赋值为空{String ss = null; }var ss:String? = null//声明常量数组{int[][][] arrs = new int[3][2][1];}val arrs = Array(3) { Array(2) { IntArray(1) } }
  • 条件表达式

    • 可以使用if…else进行判断,如

      if( true ){        //code    }else if ( false ){        //code2    }else{        //code3    }

      也可以使用when来替代switch,when的条件可以是常量,变量,返回数值的表达式,返回Boolean值的表达式。

      // 测试值 x = 0, -1, 1, 2, 3, 6, 10var x = 10when (x) {    //常量    2 -> println("等于2")    //数值表达式    if (x > 0) 1 else -1 -> println("大于0并等于1,或小于0并等于-1")    //Boolean类型表达式    in 1..5 -> println("范围匹配1-5")    !in 6..9 -> println("不是6-9")    is Int -> println("类型判断")    else -> println("else")}// 代替if...else ifwhen{    x > 6 && x <= 10  ->  println("大于6小于等于10")    x < 6 -> println("小于6")    else -> println("else")}
  • 循环

    • whiledo...while与Java中没有区别,但for有很大改变多了几个变种,如下:

      for (i in list.indices) {    print(list[i])}//递增for (int i = 2; i < list.size(); i++)for (i in 2..list.size - 1) {    print(list[i])}//递减for (int i = list.size(); i >= 0; i--)for (i in list.size downTo 0) {    print(list[i])}//操作列表内的对象for (item in list) {    print(item)}//加强版for((i, item) in list.withIndex()) {    print(list[i])    print(item)}//变种版list.forEach {    print(it)}list.forEach {    print(it)}list.forEachIndexed { i, s ->    print(list[i])    print(s)}list.forEachIndexed(object : (Int, String) -> Unit {    override fun invoke(i: Int, s: String) {        print(list[i])        print(s)    }})
  • 冒号

    • 声明常量变量的类型
      val name: String = "Hello_kotlin"
    • 方法的返回类型
      fun getPi(): Float{ return 3.14f }
    • 类的继承
      class Test_Activity(): Activity() { ... }
  • 双冒号

    • 表示把一个方法当作一个参数,传递到另一个方法进行使用,也就是引用一个方法
      print(::getResult)
    • 调用其他class中的某一个方法时
      print(otherClass::getResult)
    • 调用当前类的方法(一般this可以省略,如果调用的函数是类的成员函数或扩展函数,this不可省略)
      print(this::getResult)
  • 符号@的使用

    • 类似C中的goto,可以跳到指定的位置,或者在满足条件时跳出指定的循环,支持Lambda表达式
  • 实体类

    • 与Java中实体类不同的是,不需要创建setter/getter

      class Person {    var name: String? = null    var age: String? = null}
    • 调用实体类

      val person = Person()//赋值person.name = "kotlin"person.age = "13"//取值val name = person.nameval age = person.age
  • 字符串模板
    var result = "My name is ${person.name} and I'm $age years old "

  • 延迟加载

  • 流程控制
  • 空判断

    //类型后面加?表示可为空var age: String? = "23" //抛出空指针异常val ages = age!!.toInt()//不做处理返回 nullval ages1 = age?.toInt()//age为空返回-1val ages2 = age?.toInt() ?: -1

- 其他

- 父类需要声明为open才能被继承- 没有static 关键字