【译】kotlin 官方文档翻译-嵌套类\枚举类

本文介绍了Kotlin中类的嵌套结构、内部类的使用(包括匿名内部类和访问外部类成员),以及枚举类的用法(包括初始化、匿名类和枚举常量操作)。同时提及了lambda表达式和ActionListener在匿名内部类中的应用。
摘要由CSDN通过智能技术生成

类可以嵌套在其他类中

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") }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值