匿名对象
内联实现
匿名对象 是 CoddyKit 上的免费 Kotlin Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kotlin Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kotlin Academy 课程共包含 4 节课。
内联实现
匿名对象可以在不命名新类的情况下创建某个类或接口的实例。请使用 object 表达式。
interface Greeter { fun greet(): String }
fun main() {
val g = object : Greeter {
override fun greet() = "Hi"
}
println(g.greet())
}实现接口
对象表达式可以在需要的位置直接实现一个或多个接口。
interface Clickable { fun click() }
fun main() {
val button = object : Clickable {
override fun click() = println("Clicked")
}
button.click()
}重写类成员
您可以匿名地继承一个可继承的类,并重写其中的成员。
open class Animal { open fun sound() = "..." }
fun main() {
val cat = object : Animal() {
override fun sound() = "Meow"
}
println(cat.sound())
}保存额外状态
匿名对象可以声明自己的属性,而不局限于它所重写的内容。
fun main() {
val point = object {
val x = 3
val y = 4
}
println("${point.x}, ${point.y}")
}没有超类型的对象
如果省略超类型,该对象就只是一个临时的成员集合,适合进行快速的局部分组。
fun main() {
val config = object {
val retries = 3
val timeout = 30
}
println(config.retries)
}捕获局部变量
与静态嵌套类不同,匿名对象可以捕获封装作用域中的变量。
fun makeCounter(start: Int): () -> Int {
var count = start
val obj = object {
fun next() = count++
}
return { obj.next() }
}
fun main() {
val c = makeCounter(10)
println(c())
println(c())
}作为监听器
一种常见用法是将内联实现作为回调或监听器传入。
interface OnDone { fun done(result: Int) }
fun compute(cb: OnDone) {
cb.done(42)
}
fun main() {
compute(object : OnDone {
override fun done(result: Int) = println("Got $result")
})
}匿名对象的类型
从函数返回时,推断出的类型是所声明的超类型;如果没有超类型,则为任意类型。额外成员只能在局部位置可见。
interface Named { val name: String }
fun make(): Named = object : Named {
override val name = "X"
}
fun main() {
println(make().name)
}匿名对象与 Lambda
对于只有一个方法的接口,Lambda 更简洁;但当您必须重写多个成员或保存状态时,就需要使用匿名对象。
interface Handler {
fun onStart()
fun onStop()
}
fun main() {
val h = object : Handler {
override fun onStart() = println("start")
override fun onStop() = println("stop")
}
h.onStart()
h.onStop()
}对象表达式与对象声明
对象表达式每次都会创建一个全新的实例。对象声明(object Name {})则是一个命名的单例。两者看起来相似,但生命周期不同。
object Singleton { val id = 1 }
fun main() {
val fresh = object { val id = 2 }
println(Singleton.id)
println(fresh.id)
}简洁的比较器
匿名对象非常适合用于一次性的比较器或策略。
fun main() {
val cmp = object : Comparator<Int> {
override fun compare(a: Int, b: Int) = b - a
}
val list = listOf(1, 3, 2).sortedWith(cmp)
println(list)
}快速检查
请测试您对匿名对象的理解。
回顾
您了解了匿名对象:
object : Type {}表达式会创建一个未命名的实例。- 它们可以实现接口、继承可继承的类并保存状态。
- 它们可以捕获封装作用域中的局部变量。
- 对于包含多个方法的回调可以使用它们;对于只有一个方法的情况,优先使用 Lambda。
interface Run { fun go() }
fun main() {
val r = object : Run { override fun go() = println("go") }
r.go()
}常见问题解答
「匿名对象」课时是免费的吗?
是的 — 「匿名对象」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kotlin Academy 课程的其余内容,请升级到 CoddyKit PRO。 Kotlin Academy 课程共包含 4 节课。
「匿名对象」这节课中我会学到什么?
内联实现 你通过在浏览器中直接运行的动手代码来练习 Kotlin Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Kotlin Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Kotlin Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「匿名对象」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Kotlin Academy 课中编写并运行代码吗?
能。每节 Kotlin Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。