Kotlin笔记二

121 阅读2分钟

获取 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 {

}