继承类/实现接口
继承类和实现接口都是用的 : ,如果类中没有构造器 ( constructor ),需要在父类类名后面加上 () :
class MainActivity : BaseActivity(), View.OnClickListener
空安全设计
Kotlin
中的类型分为「可空类型」和「不可空类型」:
-
不可空类型 val editText : EditText
-
可空类型 val editText : EditText?
lateinit 关键字
-
lateinit 只能修饰 var 可读可写变量
-
lateinit 关键字声明的变量的类型必须是「不可空类型」
-
lateinit 声明的变量不能有「初始值」
-
lateinit 声明的变量不能是「基本数据类型」
-
在构造器中初始化的属性不需要 lateinit 关键字
平台类型
在类型后面加上一个感叹号的类型是「平台类型」
Java
中可以通过注解减少这种平台类型的产生
-
@Nullable 表示可空类型
-
@NotNull @NonNull 表示不可空类型
类型判断
-
is 判断属于某类型
-
!is 判断不属于某类型
-
as 类型强转,失败时抛出类型强转失败异常
-
as? 类型强转,但失败时不会抛出异常而是返回 null
获取 Class 对象
-
使用 类名 ::class 获取的是 Kotlin 的类型是 KClass
-
使用 类名 ::class.java 获取的是 Java 的类型
setter/getter
-
在 Kotlin 声明属性的时候 ( 没有使用 private 修饰 ) ,会自动生成一个私有属性和 一对公开的 setter/getter 函数。
-
在写 setter/getter 的时候使用 field 来代替内部的私有属性(防止递归栈溢 出)。
构造器
-
使用 constructor 关键字声明构造器
class User {
constructor()
}
如果我们在构造器主动调用了父类构造,那么在继承类的时候就不能在类的后面加上小括号
constructor(context: Context) : this(context, null)
// 主动调用了父类的构造器
constructor(context: Context, attr: AttributeSet?) : super(context, attr)
class CodeView : TextView {
constructor(context: Context): super(context)
}
等价:
class CodeView(context: Context) : TextView(context) {
}
@JvmField 生成属性
-
通过 @JvmField 注解可以让编译器只生成一个 public 的成员属性,不生成对 应的 setter/getter 函数
Any 和 Unit
-
Any :