LESSON 10

数据类、object 与伴生对象

让数据有形,让共享状态有家

概念 · 示例 · 练习 · 小测
预计 10 分钟可在 Playground 练习

先用人话理解

data class 适合表达一份数据,Kotlin 会为它生成 equals、hashCode、toString、copy 等常用能力。object 声明单例;companion object 放在类中,提供与实例无关的成员。

本课要点:数据类表达“是什么”,object 表达“全局只有一个”,伴生对象放置与类关联的工厂方法或常量。

代码例子

先读注释,再关注每一行如何把数据变成结果。

KOTLIN · 可独立运行
data class Order(val id: String, val total: Int) // total 用分保存,避免浮点误差

object AppSettings { // 全程序共享的单例对象
    const val APP_NAME = "轻记"
    var darkMode = false
}

class OrderId {
    companion object { // 属于类本身,不需要先创建 OrderId
        fun create(prefix: String) = "$prefix-${System.currentTimeMillis()}"
    }
}

fun main() {
    val first = Order("A102", 2599) // 一笔 25.99 元的订单
    val revised = first.copy(total = 1999)
    println(first) // Order(id=A102, total=2599)
    println(revised.total) // 1999
    println(AppSettings.APP_NAME)
    println(OrderId.create("ORD"))
}

再看一个用法

KOTLIN · 可独立运行
data class Book(val title: String, val pages: Int)

fun main() {
    val book = Book("Kotlin 小册", 120)
    val shorter = book.copy(title = "Kotlin 速查", pages = 100)
    println(shorter)
}

动手改一改

data class Book(val title: String, val pages: Int) val book = Book("Kotlin 小册", 120) val shorter = book.copy(pages = 100) // 改成复制并修改书名 println(shorter)

去 Kotlin Playground 动手 ↗

提示:Android 专属示例需要 Android Studio 项目和对应依赖;普通 Kotlin 示例可在 Playground 中尝试。

三道小测

先自己选择,再展开答案。答错也没关系,重要的是知道为什么。

1. data class 自动提供哪项能力?

查看答案与解析

正确答案:A。回到概念和代码示例,再解释一次为什么。

2. object 通常表示什么?

查看答案与解析

正确答案:B。抓住题目中的核心概念,重新对照示例理解。

3. 调用伴生对象成员通常需要先创建实例吗?

查看答案与解析

正确答案:B。抓住题目中的核心概念,重新对照示例理解。

深入阅读

想继续往下挖,可以阅读 Kotlin / Android 官方文档。

打开官方文档 ↗

标记学习进度

进度保存在当前浏览器的 localStorage 中。