Kotlin 笔记 3.6:嵌套类和枚举类

嵌套类

和 Java 一样,Kotlin 也支持在类中声明类,在类中声明的类分为:

  • 嵌套类(相当于 Java 中的静态内部类)
  • 内部类(相当于 Java 中的非静态内部类)

内部类使用 inner 关键字修饰,内部类会带有一个外部类的对象的引用,可以直接访问外部类成员:

//这么写是报错
class Outer {
    var name: String = "张三"

    class InnterClass {
        fun test(): String {
            return name
        }
    }
}
//需要加上 inner 关键字
class Outer {
    var name: String = "张三"

    inner class InnterClass {
        fun test(): String {
            return name
        }
    }
}

枚举类

使用 enum 关键字来声明一个枚举类,枚举类的每个枚举常量都是该类的实例。

枚举类默认提供了以下两个方法:

  • EnumClass.valueOf(value: String):EnumClass —— 类似于 Java 枚举类中的 valueOf(),用于根据枚举的字符串名获取实际的枚举值。如果传入的参数在枚举类中没有匹配项,则会抛出异常。
  • EnumClass.values(): Array —— 类似于 Java 中的 values() 方法,用来获取该枚举类中所有枚举值组成的数组。

和其他类不同的是,枚举类的父类并不是 Any,而是 kotlin.Enum 类,所有枚举类都可以直接使用他父类中所包含的属性和方法,kotlin.Enum 类提供了下面的方法和属性:

  • 属性:name —— 返回枚举实例的名称

    fun main() {
        val blue = Color.BLUE
        println(blue.name)
    }
    
    enum class Color {
        RED, BLACK, BLUE, GREEN, WHITE
    }
    //输出结果:BLUE
    
  • 属性:ordinal —— 返回枚举实例的索引值

    fun main() {
        val blue = Color.BLUE
        println(blue.ordinal)
    }
    
    enum class Color {
        RED, BLACK, BLUE, GREEN, WHITE
    }
    //输出结果:2
    
  • 方法:compareTo(E o): Int —— 用于两个枚举实例的位置比较,如果返回的是整数 x,表示参数实例位于比较实例的前面第 x 个位置。如果为负数,则位于后面第 x 个位置,如果是 0,表示相同位置

    fun main() {
        println(Color.BLUE.compareTo(Color.RED))
        println(Color.BLUE.compareTo(Color.BLACK))
        println(Color.BLUE.compareTo(Color.BLUE))
        println(Color.BLUE.compareTo(Color.GREEN))
        println(Color.BLUE.compareTo(Color.WHITE))
    }
    
    enum class Color {
        RED, BLACK, BLUE, GREEN, WHITE
    }
    //输出内容:
    2
    1
    0
    -1
    -2
    
  • 方法:toString: String —— 作用和 name 属性类似

    fun main() {
        val blue = Color.BLUE
        println(blue.name)
        println(blue.toString())
    }
    
    enum class Color {
        RED, BLACK, BLUE, GREEN, WHITE
    }
    //输出结果:
    BLUE
    BLUE
    
Copyright© 2020-2022 li-xyz 冀ICP备2022001112号-1