内部类
可以在类的里面再定义类
- class Outer {
- private val bar = 1
- class Nested {fun foo1() = 2
- // 错误
- //fun foo2() = bar
- }
- }
- fun main(args: Array<String>) {
- val demo = Outer.Nested().foo1()
- }
以上代码通过 IDEA 反编译后可以看到其内部的 Java 实现方式 可以看到 Nested 其实就是一个静态类, 因此 foo2() 不能访问外部类的非静态成员, 也不用先声明 Outer 变量再指向 Nested 类, 而是直接通过 Outer 类指向 Nested 类
- public final class Outer {
- private final int bar = 1;
- public static final class Nested {
- public final int foo1() {
- return 2;
- }
- }
- }
- public final class MainKotlinKt {
- public static final void main(@NotNull String[] args) {
- Intrinsics.checkParameterIsNotNull(args, "args");
- int demo = (new Outer.Nested()).foo1();
- }
- }
如果需要去访问外部类的成员, 我们需要用 inner 来声明这个类:
- class Outer {
- private val bar = 1
- inner class Nested {
- fun foo1() = 2
- fun foo2() = bar
- }
- }
- fun main(args: Array<String>) {
- val demo = Outer().Nested().foo2()
- }
再来看其内部的 Java 实现方式 使用 inner 来声明 Nested 类后, 就相当于将之声明为非静态内部类, 因此 foo2() 能访问其外部类的非静态成员, 在声明 Nested 变量前也需要通过 Outer 变量来指向其内部的 Nested 类
- public final class Outer {
- private final int bar = 1;
- public final class Nested {
- public final int foo1() {
- return 2;
- }
- public final int foo2() {
- return Outer.this.bar;
- }
- }
- }
- public final class MainKotlinKt {
- public static final void main(@NotNull String[] args) {
- Intrinsics.checkParameterIsNotNull(args, "args");
- int demo = (new Outer().new Nested()).foo2();
- }
- }
枚举
Kotlin 也提供了枚举的实现
- enum class Day {
- SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
- }
枚举可以带有参数
- enum class Day(val index: Int) {
- SUNDAY(0), MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6)
- }
枚举也包含一些函数
- fun main(args: Array<String>) {
- val day = Day.FRIDAY
- // 获取值
- val value = day.index //5
- // 通过 String 获取相应的枚举值
- val value1 = Day.valueOf("SUNDAY") //SUNDAY
- // 获取包含所有枚举值的数组
- val value2 = Day.values()
- // 获取枚举名
- val value3 = Day.SUNDAY.name //SUNDAY
- // 获取枚举声明的位置
- val value4 = Day.TUESDAY.ordinal //2
- }
来源: https://juejin.im/post/5adc7c676fb9a07aca79bff6