0Pricing
Kotlin Academy · 课时

数据类基础:自动生成的方法

理解 data class 会生成哪些内容:equals、hashCode、toString 和 copy。

数据类基础:自动生成的方法 是 CoddyKit 上的免费 Kotlin Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kotlin Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kotlin Academy 课程共包含 4 节课。

什么是数据类?

数据类的主要用途是存放值。Kotlin 编译器会自动为您生成 equals、hashCode、toString、copy 和 componentN 函数。

声明数据类

在普通类前加上 data。主构造函数的所有参数都必须是 val 或 var。

data class User(val name: String, val age: Int)
fun main() {
    val u = User("Ada", 35)
    println(u)
}

自动生成的 toString

编译器会创建一个 toString,按名称列出每个属性。

data class Point(val x: Int, val y: Int)
fun main() {
    println(Point(3, 5)) // Point(x=3, y=5)
}

自动生成的 equals

equals 会比较所有属性值——即使引用身份不同,只要两个实例的字段相同,它们就相等。

data class Coord(val lat: Double, val lng: Double)
fun main() {
    val a = Coord(41.0, 29.0)
    val b = Coord(41.0, 29.0)
    println(a == b)      // true (structural)
    println(a === b)     // false (reference)
}

自动生成的 hashCode

hashCode 与 equals 保持一致:相等的对象会产生相等的哈希值,因此数据类可以在集合中以及作为映射键正常工作。

data class Key(val id: Int, val tag: String)
fun main() {
    val map = mapOf(Key(1, "a") to "one")
    println(map[Key(1, "a")]) // one
}

自动生成的 copy

copy() 会创建一个字段值相同的新实例,并允许通过命名参数覆盖各个字段。

data class Config(val host: String, val port: Int, val tls: Boolean)
fun main() {
    val dev = Config("localhost", 8080, false)
    val prod = dev.copy(host = "prod.example.com", tls = true)
    println(prod) // Config(host=prod.example.com, port=8080, tls=true)
}

自动生成的 componentN

每个属性都会获得一个 componentN() 函数(component1、component2……),从而支持解构。

data class Pair2(val first: String, val second: Int)
fun main() {
    val p = Pair2("Ada", 35)
    val (name, age) = p
    println("$name is $age")
}

数据类不会做什么

数据类不会为继承的字段生成 toString,默认是 final,并且不能是 abstract、open、sealed 或 inner。

data class Sample(val n: Int)
// open data class Bad(...) // ERROR
// sealed data class Bad(...) // ERROR
fun main() { println(Sample(1)) }

主构造函数之外的属性

在类体中声明的属性不会参与 equals、hashCode、toString 或 copy。

data class Person(val name: String) {
    var nickname: String = ""
}
fun main() {
    val a = Person("Ada").apply { nickname = "Augusta" }
    val b = Person("Ada").apply { nickname = "Different" }
    println(a == b)   // true — only name matters
    println(a)         // Person(name=Ada)
}

默认值

将 data class 与默认参数结合使用,可以实现灵活的构造方式。

data class Request(
    val url: String,
    val method: String = "GET",
    val headers: Map<String, String> = emptyMap()
)
fun main() {
    println(Request("https://api.example.com"))
}

实用示例:DTO 类

数据类非常适合表示数据传输对象(DTO)、API 响应和数值对象。

data class ApiResponse(
    val status: Int,
    val body: String,
    val timestamp: Long
)
fun main() {
    val ok = ApiResponse(200, "{}", System.currentTimeMillis())
    println(ok)
}

快速检查

对于数据类,Kotlin 编译器不会自动生成哪个方法?

回顾

data class 会根据主构造函数中的属性自动生成 equals、hashCode、toString、copy 和 componentN。构造函数之外的属性会被排除。请将数据类用于 DTO、数值对象,以及任何用于存放相关值的容器。

常见问题解答

「数据类基础:自动生成的方法」课时是免费的吗?

是的 — 「数据类基础:自动生成的方法」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kotlin Academy 课程的其余内容,请升级到 CoddyKit PRO。 Kotlin Academy 课程共包含 4 节课。

「数据类基础:自动生成的方法」这节课中我会学到什么?

理解 data class 会生成哪些内容:equals、hashCode、toString 和 copy。 你通过在浏览器中直接运行的动手代码来练习 Kotlin Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Kotlin Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Kotlin Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「数据类基础:自动生成的方法」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Kotlin Academy 课中编写并运行代码吗?

能。每节 Kotlin Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 数据类基础:自动生成的方法
  2. 使用 copy() 复制与部分覆盖
  3. 使用 componentN 进行解构声明
  4. 集合中的数据类与作为 Map 键
← 返回 Kotlin Academy