获取 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
构造器
使⽤ constructor 关键字声明构造器
class User {
constructor()
}
如果我们在构造器主动调⽤了了⽗类构造,那么在继承类的时候就不能在类的后⾯
加上⼩括号
constructor(context: Context) : this(context, null)
// 主动调⽤⽤了⽗类的构造器
constructor(context: Context, attr: AttributeSet?) :
super(context, attr)
@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 {
}