类可以嵌套在其他类中
class Outer { private val bar: Int = 1 class Nested { fun foo() = 2 } } val demo = Outer.Nested().foo() //==2
内部类
类可以标记为 inner 这样就可以访问外部类的成员。内部类拥有外部类的一个对象引用:
class Outer { private val bar: Int = 1 inner class Inner { fun foo() = bar } } val demo = Outer().Inner().foo() //==1
参看这里了解更多 this 在内部类的用法
匿名内部类
匿名内部类的实例是通过 对象表达式 创建的:
window.addMouseListener(object: MouseAdapter() { override fun mouseClicked(e: MouseEvent) { // ... } override fun mouseEntered(e: MouseEvent) { // ... } })
如果对象是函数式的 java 接口的实例(比如只有一个抽象方法的 java 接口),你可以用一个带接口类型的 lambda 表达式创建它。
枚举类最基本的用法就是实现类型安全的枚举
enum class Direction { NORTH,SOUTH,WEST }
每个自举常量都是一个对象。枚举常量通过逗号分开。
初始化
因为每个枚举都是枚举类的一个实例,它们是可以初始化的。
enum class Color(val rgb: Int) { RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF) }
匿名类
枚举实例也可以声明它们自己的匿名类
enum class ProtocolState { WAITING { override fun signal() = Taking }, Taking{ override fun signal() = WAITING }; abstract fun signal(): ProtocolState }
可以有对应的方法,以及复写基本方法。注意如果枚举定义了任何成员,你需要像在 java 中那样用分号 ; 把枚举常量定义和成员定义分开。
使用枚举常量
像 java 一样,Kotlin 中的枚举类有合成方法允许列出枚举常量的定义并且通过名字获得枚举常量。这些方法的签名就在下面列了出来(假设枚举类名字是 EnumClass):
EnumClass.valueOf(value: String): EnumClass EnumClass.values(): Array<EnumClass>
如果指定的名字在枚举类中没有任何匹配,那么valueOf()
方法将会抛出参数异常。
每个枚举常量都有获取在枚举类中声明的名字和位置的方法:
name(): Sting ordinal(): Int
枚举类也实现了 Comparable 接口,比较时使用的是它们在枚举类定义的自然顺序。
val listener = ActionListener { println("clicked") }