var/val 变量名 : 类型 = 初始值
var 可变
val 不可变
异常处理
!! 抛出异常
? 返回null
?: 对null进行处理
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // 注意这个块
print("x 不是 1 ,也不是 2")
}
}
内部类 : inner class name
类属性修饰符
abstract // 抽象类
final // 类不可继承,默认属性
enum // 枚举类
open // 类可继承,类默认是final的
annotation // 注解类
访问权限修饰符
private // 仅在同一个文件中可见
protected // 同一个文件中或子类可见
public // 所有调用的地方都可见
internal // 同一个模块中可见
一个类要被继承需要open修饰
子类有主构造函数的话,基类也需要在主构造函数中初始化
子类没有主构造函数的话,需要在二级构造函数时,super初始化基类。eg:
constructor(ctx: Context) : super(ctx) {
}
要被子类重写的方法需要open修饰,默认final修饰。重写前面override修饰
接口的话默认就是open
可以用一个var属性重写一个val属性
扩展函数 fun className.methodName()
在扩展函数和成员函数名称一致时候,会使用成员函数
伴生对象companion (相当于java的static对象)
class MyClass {
companion object { } // 将被称为 "Companion"
}
fun MyClass.Companion.foo() {
println("伴随对象的扩展函数")
}
val MyClass.Companion.no: Int
get() = 10
fun main(args: Array<String>) {
println("no:${MyClass.no}")
MyClass.foo()
}
data class
数据类不能继承类,但是可以实现接口
声明处型变 : in(只能作为入参,不能输出)/out(只能输出,不能入参)