1.内部类
静态内部类
class Outer {
private val bar: Int = 1
class Nested {
fun foo() = 2
}
}
val demo = Outer.Nested().foo() // == 2
内部类,可以访问外部类的成员,用qualified this
来指代不同的类
class Outer {
private val bar: Int = 1
inner class Inner {
fun foo() = bar
}
}
val demo = Outer().Inner().foo() // == 1
匿名内部类
通过object expression
来定义匿名内部类
window.addMouseListener(object: MouseAdapter() {
override fun mouseClicked(e: MouseEvent) {
// ...
}
override fun mouseEntered(e: MouseEvent) {
// ...
}
})
如果对象是java函数接口(只有一个抽象方法的接口),那么可以在接口名后加lambda表达式
val listener = ActionListener { println("clicked") }
枚举
定义枚举,每个枚举常量都是一个object
enum class Direction {
NORTH, SOUTH, WEST, EAST
}
枚举可以定义属性
enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
}
定义方法
enum class ProtocolState {
WAITING {
override fun signal() = TALKING
},
TALKING {
override fun signal() = WAITING
};
abstract fun signal(): ProtocolState
}
枚举常量预定义的属性
val name: String //名字
val ordinal: Int //定义的位置
通过valueOf来得到某个枚举常量,通过values来得到枚举常量的数组
EnumClass.valueOf(value: String): EnumClass
EnumClass.values(): Array<EnumClass>
Enum还实现了Comparable接口,按照定义的顺序排序
异常
扔出异常
throw MyException("Hi There!")
catch 异常
try {
// some code
}
catch (e: SomeException) {
// handler
}
finally {
// optional finally block
}
try..catch 有返回值
val a: Int? = try { parseInt(input) } catch (e: NumberFormatException) { null }
Kotlin没有checked exception,当调用声明了checked exception的java方法时,不要求catch异常