lateinit 关键字
- lateinit 只能修饰 var 可读可写变量
- lateinit 关键字声明的变量的类型必须是「不可空类型」
- lateinit 声明的变量不能有「初始值」
- lateinit 声明的变量不能是「基本数据类型」 在构造器中初始化的属性不需要 lateinit 关键字
类型判断
- is 判断属于某类型
- !is 判断不属于某类型
- as 类型强转,失败时抛出类型强转失败异常
- as? 类型强转,但失败时不会抛出异常⽽是返回 null
获取 Class 对象
- 使⽤ 类名::class 获取的是 Kotlin 的类型是 KClass
- 使⽤ 类名::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
- Any Kotlin 的顶层⽗类是 Any ,对应 Java 当中的 Object ,但是⽐ Object 少了 wait()/notify() 等函数
- 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) 例外