内部类
- 在类中也可以定义类,默认是
public
,成为嵌套类
-
嵌套类
用关键字inner
标记,称为内部类
。 -
内部类
可以访问外部类
的private
属性与方法。 -
内部类
可以使用this@{OutterClassName}
获取外部类实例
class OutterClass(private val name: String) {//声明外部类私有属性
private fun print(): String { //声明外部类私有方法
return "一般人看不到我!"
}
inner class InnerClass {//声明一个外部类私有方法
fun print() {
System.out.println("我是$name") //内部类可以看到外部类私有属性
System.out.println("${this@OutterClass.print()}")//内部类可以看到外部类私有方法,可以试试去掉this@OutterClass
}
}
}
fun main(args: Array<String>) {
var instance: OutterClass.InnerClass = OutterClass("doulala").InnerClass()
instance.print() //打印“我是doulala 一般人看不到我”
}
内部类的应用场景
kotlin中的内部类
与java中的内部类一样,他通常能在逻辑上与外部类
保持密切关系。
但是kotlin中,必须通过inner
关键字的修饰的内部类
才可以访问外部类
的 私有成员
与私有方法
。还是很安全
,kotlin真是一个安全的语言。
枚举类
枚举类
提供了多个可直接访问枚举值。使用关键字enum
修饰,通过className.elementName
访问枚举值。
枚举类
可以添加属性,但是它的var
的属性仍然是可读写的,为了防止被篡改,所有属性建议使用val
声明。枚举值
有两个隐藏的属性name
和ordinal
,分别用于表示枚举值的名称及序列(ps:所以声明自定义属性不能声明为name
)-
枚举值
获取一共有三种方式:- 直接访问
- 使用
className.valueof(name)
获取 - 使用
enumValues<EnumClassSimple>()
获取
enum class EnumClassSimple(val age: Int) {
DOULALA0(18), doulala1(17), DouLala2(16)
}
fun main(args: Array<String>) {
System.out.println("顺序 : ${EnumClassSimple.DOULALA0.ordinal}") //方法1,直接访问
System.out.println("枚举名称 : ${EnumClassSimple.DOULALA0.name}")
System.out.println("属性 : ${EnumClassSimple.DOULALA0.age}") //
for (e: EnumClassSimple in EnumClassSimple.values()) { //通过values()遍历
System.out.println("遍历顺序 : ${e.ordinal}")
System.out.println("遍历属性 : ${e.name}")
System.out.println("遍历属性 : ${e.age}")
e.age=20 //会报错,如果把age声明为var,则会全局性改动这个枚举值的age属性
}
var e = enumValues<EnumClassSimple>().get(1) //方法3 ,该类还有很多其他方法
System.out.println("enumValues<T>顺序 : ${e.ordinal}")
System.out.println("enumValues<T>枚举名称 : ${e.name}")
System.out.println("enumValues<T>遍历属性 : ${e.age}")
System.out.println("Find Enum : ${EnumClassSimple.valueOf("DouLala2").ordinal}") //方法2
System.out.println("Find Enum : ${EnumClassSimple.valueOf("doulala").ordinal}") //由于找不到,会报错 No enum constant doulala.kotlin.demo.clazz.enum.EnumClassSimple.doulala
}