kotlin基础

113 阅读3分钟
lateinit 关键字
  1. lateinit 只能修饰 var 可读可写变量
  2. lateinit 关键字声明的变量的类型必须是「不可空类型」
  3. lateinit 声明的变量不能有「初始值」
  4. lateinit 声明的变量不能是「基本数据类型」 在构造器中初始化的属性不需要 lateinit 关键字
类型判断
  1. is 判断属于某类型
  2. !is 判断不属于某类型
  3. as 类型强转,失败时抛出类型强转失败异常
  4. as? 类型强转,但失败时不会抛出异常⽽是返回 null
获取 Class 对象
  1. 使⽤ 类名::class 获取的是 Kotlin 的类型是 KClass
  2. 使⽤ 类名::class.java 获取的是 Java 的类
setter/getter

在 Kotlin 声明属性的时候(没有使⽤ private 修饰),会⾃动⽣成⼀个私有属性和 ⼀对公开的 setter/getter 函数。 在写 setter/getter 的时候使⽤ field 来代替内部的私有属性(防⽌递归栈溢 出)。 为什么 EditText.getText() 的时候可以简化,但是 EditText.setText() 的时候不能和 TextView.setText() ⼀样简化? 因为 EditText.getText() 获得的类型是 Editable ,对应的如果 EditText.setText() 传⼊的参数也是 Editable 就可以简化了。

val newEditable = Editable.Factory.getInstance().newEditable("Kotlin")
et_username.text = newEditable
@JvmField

⽣成属性 通过 @JvmField 注解可以让编译器只⽣成⼀个 public 的成员属性,不⽣成对 应的 setter/getter 函数

Any 和 Unit
  1. Any Kotlin 的顶层⽗类是 Any ,对应 Java 当中的 Object ,但是⽐ Object 少了 wait()/notify() 等函数
  2. Unit Kotlin 中的 Unit 对应 Java 中的 void
数组

使⽤ arrayof() 来创建数组,基本数据类型使⽤对应的 intArrayOf() 等

静态函数和属性
  • 顶层函数
  • object
  • companion object 其中,「顶层函数」直接在⽂件中定义函数和属性,会直接⽣成静态的,在 Java 中 通过「⽂件名Kt」来 访问,同时可以通过 @file:JvmName 注解来修改这个「类 名」。 需要注意,这种顶层函数不要声明在 module 内最顶层的包中,⾄少要在⼀个 包中例如 com 。不然不能⽅便使⽤。 object 和 companion object 都是⽣成单例例对象,然后通过单例对象访问 函数和属性的。
@JvmStatic

通过这个注解将 object 和 companion object 的内部函数和属性,真正⽣成 为静态的。

单例模式/匿名内部类

通过 object 关键字实现

// 单例
object Singleton { 

} 
// 匿名内部类 
object : OnClickListener { 

}
多⾏字符串
val s = """ 
           我是第⼀⾏ 
           我是第⼆⾏ 
           我是第三⾏ 
       """.trimIndent()
标签
  • 在 Java 中通过 「 类名.this 例如 Outer.this 」 获取⽬标类引⽤
  • 在 Kotlin 中通过「 this@类名 例如 this@Outer 」获取⽬标类引⽤
内部类
  • 在 Kotlin 当中,内部类默认是静态内部类
  • 通过 inner 关键字声明为嵌套内部类
可⻅性修饰符
  • 默认的可⻅性修饰符是 public
  • 新增的可⻅性修饰符 internal 表示当前模块可⻅
open/final

Kotlin 中的类和函数,默认是被 final 修饰的 ( abstract 和 override) 例外