先用人话理解
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 中。