数据类基础:自动生成的方法
理解 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 反馈 — 无需本地设置。