0Pricing
Kotlin Academy · 课时

匿名对象

内联实现

匿名对象 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 嵌套类
  2. 内部类
  3. 匿名对象
  4. 局部类
← 返回 Kotlin Academy